nomadcode/internal/http/middleware.go

37 lines
803 B
Go

package http
import (
"log/slog"
stdhttp "net/http"
"time"
)
type statusRecorder struct {
stdhttp.ResponseWriter
status int
}
func (r *statusRecorder) WriteHeader(status int) {
r.status = status
r.ResponseWriter.WriteHeader(status)
}
func loggingMiddleware(logger *slog.Logger) func(stdhttp.Handler) stdhttp.Handler {
return func(next stdhttp.Handler) stdhttp.Handler {
return stdhttp.HandlerFunc(func(w stdhttp.ResponseWriter, r *stdhttp.Request) {
start := time.Now()
recorder := &statusRecorder{ResponseWriter: w, status: stdhttp.StatusOK}
next.ServeHTTP(recorder, r)
if logger != nil {
logger.Info(
"http request",
"method", r.Method,
"path", r.URL.Path,
"status", recorder.status,
"duration", time.Since(start).String(),
)
}
})
}
}