45 lines
895 B
Go
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))
|
|
})
|
|
}
|