package ext import ( "log/slog" "net/http" "time" ) type statusWraper struct { statusCode int innerWriter http.ResponseWriter } func (s *statusWraper) Header() http.Header { return s.innerWriter.Header() } func (s *statusWraper) Write(b []byte) (int, error) { return s.innerWriter.Write(b) } func (s *statusWraper) WriteHeader(statusCode int) { s.statusCode = statusCode s.innerWriter.WriteHeader(statusCode) } func (s *statusWraper) StatusCode() int { if s.statusCode == 0 { return 200 } return s.statusCode } func wrap(w http.ResponseWriter) *statusWraper { return &statusWraper{ innerWriter: w, } } func Log(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { t := time.Now() s := wrap(w) next(s, r) slog.Info( "Http request", "method", r.Method, "code", s.StatusCode(), "path", r.URL, "elapsed", time.Since(t), ) } }