all repos — website @ 49b4d4d4e2bfcb5152b574100755bfbd39ede602

My website

make 404 page dynamic
Alan Pearce alan@alanpearce.eu
Mon, 24 Jun 2024 21:49:00 +0200
commit

49b4d4d4e2bfcb5152b574100755bfbd39ede602

parent

a2feb8c63c80a1f52830f562af2deb2c6065eaae

1 files 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)