diff options
Diffstat (limited to 'internal/server/logging.go')
-rw-r--r-- | internal/server/logging.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/internal/server/logging.go b/internal/server/logging.go new file mode 100644 index 0000000..fcdab18 --- /dev/null +++ b/internal/server/logging.go @@ -0,0 +1,52 @@ +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} +} + +type wrappedHandlerOptions struct { + defaultHostname string +} + +func wrapHandlerWithLogging(wrappedHandler http.Handler, opts wrappedHandlerOptions) 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.Header.Get("Host") + if host == "" { + host = opts.defaultHostname + } + lw := NewLoggingResponseWriter(w) + wrappedHandler.ServeHTTP(lw, r) + 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"), + ) + }) +} |