package middleware import ( "log/slog" "net/http" "time" ) type statusWriter struct { http.ResponseWriter status int } func (sw *statusWriter) WriteHeader(code int) { sw.status = code sw.ResponseWriter.WriteHeader(code) } // RequestTimer logs method, path, status, and elapsed milliseconds for every // request. Parity with Python's get_render_time — the elapsed value maps to // render_time.total in the M5 JSON allowlist. func RequestTimer(logger *slog.Logger, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() sw := &statusWriter{ResponseWriter: w, status: http.StatusOK} next.ServeHTTP(sw, r) logger.Info("req", "method", r.Method, "path", r.URL.Path, "status", sw.status, "ms", time.Since(start).Milliseconds(), ) }) }