From ddacf8e5aafaf59742d840efece4ac2cb9c3aa22 Mon Sep 17 00:00:00 2001 From: Elias Kohout Date: Sat, 11 Jan 2025 19:28:53 +0100 Subject: [PATCH] add middleware stack --- src/cmd/frontend/main.go | 7 ++++++- src/internal/middleware/logging.go | 22 +++++++++++++++++++--- src/internal/middleware/middleware.go | 15 +++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 src/internal/middleware/middleware.go diff --git a/src/cmd/frontend/main.go b/src/cmd/frontend/main.go index d9e73d6..b4da5aa 100644 --- a/src/cmd/frontend/main.go +++ b/src/cmd/frontend/main.go @@ -19,10 +19,15 @@ func main() { // define app webapp := app.NewApp(db) + // create middle + stack := middleware.CreateStack( + middleware.Logging, + ) + // start web server server := http.Server{ Addr: ":8080", - Handler: middleware.Logging(webapp.Routes()), + Handler: stack(webapp.Routes()), } log.Println("server started, listening on :8080") diff --git a/src/internal/middleware/logging.go b/src/internal/middleware/logging.go index cc1dc66..807ee8e 100644 --- a/src/internal/middleware/logging.go +++ b/src/internal/middleware/logging.go @@ -6,14 +6,30 @@ import ( "time" ) +type wrappedWriter struct { + http.ResponseWriter + statusCode int +} + +func (w *wrappedWriter) WriteHeader(statusCode int) { + w.ResponseWriter.WriteHeader(statusCode) + w.statusCode = statusCode +} + // LoggingMiddleware logs details about each incoming HTTP request. func Logging(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() - // Call the next handler - next.ServeHTTP(w, r) + wrapped := &wrappedWriter{ + ResponseWriter: w, + statusCode: http.StatusOK, + } - log.Printf("[request] %s %s from %s (%v)", r.URL.Path, r.Method, r.RemoteAddr, time.Since(start)) + // Call the next handler + next.ServeHTTP(wrapped, r) + + log.Printf("[request] %d %s %s from %s (%v)", + wrapped.statusCode, r.Method, r.URL.Path, r.RemoteAddr, time.Since(start)) }) } diff --git a/src/internal/middleware/middleware.go b/src/internal/middleware/middleware.go new file mode 100644 index 0000000..da5ca6d --- /dev/null +++ b/src/internal/middleware/middleware.go @@ -0,0 +1,15 @@ +package middleware + +import "net/http" + +type Middleware func(http.Handler) http.Handler + +func CreateStack(xs ...Middleware) Middleware { + return func(next http.Handler) http.Handler { + for i := len(xs) - 1; i >= 0; i-- { + x := xs[i] + next = x(next) + } + return next + } +}