package server import ( "net/http" "website/internal/log" ) type LoggingResponseWriter struct { http.ResponseWriter statusCode int } func (lrw *LoggingResponseWriter) WriteHeader(code int) { lrw.statusCode = code // avoids warning: superfluous response.WriteHeader call if lrw.statusCode != http.StatusOK { lrw.ResponseWriter.WriteHeader(code) } } func NewLoggingResponseWriter(w http.ResponseWriter) *LoggingResponseWriter { return &LoggingResponseWriter{w, http.StatusOK} } func wrapHandlerWithLogging(wrappedHandler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { scheme := r.Header.Get("X-Forwarded-Proto") if scheme == "" { scheme = "http" } host := r.Host lw := NewLoggingResponseWriter(w) wrappedHandler.ServeHTTP(lw, r) if r.URL.Path == "/health" { return } statusCode := lw.statusCode log.Info( "http request", "scheme", scheme, "method", r.Method, "status", statusCode, "host", host, "path", r.URL.Path, "location", lw.Header().Get("Location"), ) }) }