package httpx import ( "log" "net/http" "time" ) type ResponseWriterTracker struct { StatusCode int Wrote bool http.ResponseWriter } func (w ResponseWriterTracker) WasWritten() bool { return w.StatusCode != 0 || w.Wrote } func (w *ResponseWriterTracker) WriteHeader(statusCode int) { w.StatusCode = statusCode w.ResponseWriter.WriteHeader(statusCode) } func (w *ResponseWriterTracker) Write(b []byte) (int, error) { w.Wrote = true return w.ResponseWriter.Write(b) } func NewResponseWriterTracker(w http.ResponseWriter) ResponseWriterTracker { return ResponseWriterTracker{ResponseWriter: w} } func Log(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { wt := NewResponseWriterTracker(w) start := time.Now() next.ServeHTTP(&wt, r) log.Println(r.Method, r.URL.Path, wt.StatusCode, time.Since(start)) }) }