40 lines
930 B
Go
40 lines
930 B
Go
package webmiddleware
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"net/http"
|
|
"time"
|
|
|
|
webutils "git.mstar.dev/mstar/goutils/http"
|
|
"github.com/rs/zerolog/hlog"
|
|
)
|
|
|
|
func TraceRequestInfoMiddleware(h http.Handler) http.Handler {
|
|
return webutils.ChainMiddlewares(
|
|
h,
|
|
hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) {
|
|
if !hlog.FromRequest(r).Trace().Enabled() {
|
|
return
|
|
}
|
|
body, _ := io.ReadAll(r.Body)
|
|
r.Body = io.NopCloser(bytes.NewReader(body))
|
|
IPAddress := r.Header.Get("X-Real-Ip")
|
|
if IPAddress == "" {
|
|
IPAddress = r.Header.Get("X-Forwarded-For")
|
|
}
|
|
if IPAddress == "" {
|
|
IPAddress = r.RemoteAddr
|
|
}
|
|
hlog.FromRequest(r).Trace().Any("headers", r.Header).
|
|
Bytes("body", body).
|
|
Str("method", r.Method).
|
|
Stringer("url", r.URL).
|
|
Int("status", status).
|
|
Int("size", size).
|
|
Str("real-ip", IPAddress).
|
|
Dur("duration", duration).
|
|
Send()
|
|
}),
|
|
)
|
|
}
|