diff --git a/internal/middleware/request_tracing.go b/internal/middleware/request_tracing.go index 4eb5718..343fd36 100644 --- a/internal/middleware/request_tracing.go +++ b/internal/middleware/request_tracing.go @@ -2,10 +2,12 @@ package middleware import ( "bookhoard/internal/config" + "bufio" "bytes" "encoding/json" "io" "log" + "net" "net/http" "time" @@ -15,9 +17,21 @@ import ( type responseWriter struct { http.ResponseWriter - size int + size int + status int } +func (r *responseWriter) WriteHeader(statusCode int) { + r.status = statusCode + r.ResponseWriter.WriteHeader(statusCode) +} +func (r *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + // Pass through Hijacker if underlying writer supports it + if hj, ok := r.ResponseWriter.(http.Hijacker); ok { + return hj.Hijack() + } + return nil, nil, http.ErrNotSupported +} func (r *responseWriter) Write(b []byte) (int, error) { size, err := r.ResponseWriter.Write(b) r.size += size @@ -105,7 +119,7 @@ func RequestTracingMiddleware(cfg *config.Config) echo.MiddlewareFunc { RemoteAddr: c.RealIP(), UserAgent: c.Request().UserAgent(), Duration: duration, - StatusCode: c.Response().(*echo.Response).Status, + StatusCode: recorder.status, ResponseSize: int64(recorder.size), }