all repos — homestead @ 6ad615fb7db755e85e1124c11f0d61afeda1f524

Code for my website

make 404 page dynamic

Alan Pearce
commit

6ad615fb7db755e85e1124c11f0d61afeda1f524

parent

7c9ce0ed7f5058db65a13c036857cd7c32a5464b

1 file changed, 17 insertions(+), 5 deletions(-)

jump to
M internal/website/mux.gointernal/website/mux.go
@@ -7,6 +7,7 @@ "path"
"strings" "website/internal/config" "website/internal/log" + "website/templates" "github.com/benpate/digit" "github.com/kevinpollet/nego"
@@ -32,18 +33,29 @@ }
type webHandler func(http.ResponseWriter, *http.Request) *HTTPError -func (fn webHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { +type WrappedWebHandler struct { + config *config.Config + handler webHandler +} + +func wrapHandler(cfg *config.Config, webHandler webHandler) WrappedWebHandler { + return WrappedWebHandler{ + config: cfg, + handler: webHandler, + } +} + +func (fn WrappedWebHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { defer func() { if fail := recover(); fail != nil { w.WriteHeader(http.StatusInternalServerError) log.Error("runtime panic!", "error", fail) } }() - if err := fn(w, r); err != nil { + if err := fn.handler(w, r); err != nil { if strings.Contains(r.Header.Get("Accept"), "text/html") { w.WriteHeader(err.Code) - notFoundPage := "website/private/404.html" - http.ServeFile(w, r, notFoundPage) + templates.NotFound(*fn.config, r.URL.Path).Render(r.Context(), w) } else { http.Error(w, err.Message, err.Code) }
@@ -60,7 +72,7 @@ if err != nil {
return nil, errors.WithMessagef(err, "registering content files") } - mux.Handle("/", webHandler(func(w http.ResponseWriter, r *http.Request) *HTTPError { + mux.Handle("/", wrapHandler(cfg, func(w http.ResponseWriter, r *http.Request) *HTTPError { urlPath, shouldRedirect := canonicalisePath(r.URL.Path) if shouldRedirect { http.Redirect(w, r, urlPath, 302)