48 lines
867 B
Go
48 lines
867 B
Go
|
package webutil
|
||
|
|
||
|
import (
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"os"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
var _log = log.New(os.Stderr, "", 0)
|
||
|
|
||
|
type responseWriterWrapper struct {
|
||
|
http.ResponseWriter
|
||
|
httpStatus int
|
||
|
responseSize int
|
||
|
}
|
||
|
|
||
|
func (w *responseWriterWrapper) WriteHeader(status int) {
|
||
|
w.httpStatus = status
|
||
|
w.ResponseWriter.WriteHeader(status)
|
||
|
}
|
||
|
|
||
|
func (w *responseWriterWrapper) Write(b []byte) (int, error) {
|
||
|
if w.httpStatus == 0 {
|
||
|
w.httpStatus = 200
|
||
|
}
|
||
|
w.responseSize += len(b)
|
||
|
return w.ResponseWriter.Write(b)
|
||
|
}
|
||
|
|
||
|
func WithLogging(inner http.HandlerFunc) http.HandlerFunc {
|
||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||
|
t := time.Now()
|
||
|
wrapper := responseWriterWrapper{w, 0, 0}
|
||
|
|
||
|
inner(&wrapper, r)
|
||
|
_log.Printf("%s \"%s %s %s\" %d %d %v\n",
|
||
|
r.RemoteAddr,
|
||
|
r.Method,
|
||
|
r.URL.Path,
|
||
|
r.Proto,
|
||
|
wrapper.httpStatus,
|
||
|
wrapper.responseSize,
|
||
|
time.Since(t),
|
||
|
)
|
||
|
}
|
||
|
}
|