package rest import ( "log" "net/http" "time" ) // responseWriter wraps http.ResponseWriter to capture status code type responseWriter struct { http.ResponseWriter statusCode int } func (rw *responseWriter) WriteHeader(code int) { rw.statusCode = code rw.ResponseWriter.WriteHeader(code) } func (rw *responseWriter) Unwrap() http.ResponseWriter { return rw.ResponseWriter } func (rw *responseWriter) Flush() { if f, ok := rw.ResponseWriter.(http.Flusher); ok { f.Flush() } } // loggingMiddleware logs requests with timing func (s *Server) loggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() wrapped := &responseWriter{ResponseWriter: w, statusCode: http.StatusOK} next.ServeHTTP(wrapped, r) duration := time.Since(start) // Log request (in production, use structured logger) log.Printf("%s %s %d %v", r.Method, r.URL.Path, wrapped.statusCode, duration) }) } // compressionMiddleware is a pass-through today; it exists so that the // routing stack can be composed without conditionals while we evaluate the // right compression approach (likely gorilla/handlers.CompressHandler in a // follow-up). Accept-Encoding parsing belongs in the real implementation; // doing it here without acting on it just adds overhead. func (s *Server) compressionMiddleware(next http.Handler) http.Handler { return next }