package middleware import ( "log/slog" "net/http" ) type LoggingResponseWriter struct { http.ResponseWriter statusCode int } func NewLoggingResponseWriter(w http.ResponseWriter) *LoggingResponseWriter { return &LoggingResponseWriter{w, http.StatusOK} } func (lrw *LoggingResponseWriter) WriteHeader(code int) { lrw.statusCode = code lrw.ResponseWriter.WriteHeader(code) } func LoggingMiddleware(logger *slog.Logger) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { logger.InfoContext(r.Context(), "Incoming request", slog.String("method", r.Method), slog.String("path", r.URL.String()), ) lrw := NewLoggingResponseWriter(w) next.ServeHTTP(lrw, r) logger.InfoContext(r.Context(), "Sent response", slog.Int("code", lrw.statusCode), slog.String("message", http.StatusText(lrw.statusCode)), ) }) } }