shelves/internal/httpx/middleware.go
2024-11-16 18:36:36 -05:00

45 lines
895 B
Go

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))
})
}