diff --git a/functions/infra/http_logger_middleware.go b/functions/infra/http_logger_middleware.go index 8ab8e243..fc4bb48a 100644 --- a/functions/infra/http_logger_middleware.go +++ b/functions/infra/http_logger_middleware.go @@ -1,13 +1,17 @@ package infra import ( + "bufio" "fmt" "io" + "net" "net/http" "time" ) // responseWriter captura el status code escrito al ResponseWriter. +// Implementa http.Hijacker y http.Flusher delegando al writer subyacente +// para preservar WebSocket upgrade y SSE. type responseWriter struct { http.ResponseWriter status int @@ -18,6 +22,23 @@ func (rw *responseWriter) WriteHeader(status int) { rw.ResponseWriter.WriteHeader(status) } +// Hijack delega en el ResponseWriter subyacente si lo soporta. Necesario +// para que WebSocket Upgrade funcione a traves del logger middleware. +func (rw *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if h, ok := rw.ResponseWriter.(http.Hijacker); ok { + return h.Hijack() + } + return nil, nil, http.ErrNotSupported +} + +// Flush delega en el ResponseWriter subyacente si lo soporta. Necesario +// para SSE y respuestas streaming. +func (rw *responseWriter) Flush() { + if f, ok := rw.ResponseWriter.(http.Flusher); ok { + f.Flush() + } +} + // HTTPLoggerMiddleware retorna un Middleware que loguea metodo, path, status y duracion de cada request. // El formato de cada linea es: METHOD /path STATUS DURACIONms func HTTPLoggerMiddleware(logger io.Writer) Middleware {