53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"slices"
|
|
"time"
|
|
|
|
"github.com/rs/zerolog/hlog"
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
type HandlerBuilder func(http.Handler) http.Handler
|
|
|
|
func ChainMiddlewares(base http.Handler, links ...HandlerBuilder) http.Handler {
|
|
slices.Reverse(links)
|
|
for _, f := range links {
|
|
base = f(base)
|
|
}
|
|
return base
|
|
}
|
|
|
|
func ContextValsMiddleware(pairs map[any]any) HandlerBuilder {
|
|
return func(h http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
for key, val := range pairs {
|
|
ctx = context.WithValue(ctx, key, val)
|
|
}
|
|
newRequest := r.WithContext(ctx)
|
|
h.ServeHTTP(w, newRequest)
|
|
})
|
|
}
|
|
}
|
|
|
|
func LoggingMiddleware(handler http.Handler) http.Handler {
|
|
return ChainMiddlewares(handler,
|
|
hlog.NewHandler(log.Logger),
|
|
hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) {
|
|
hlog.FromRequest(r).Info().
|
|
Str("method", r.Method).
|
|
Stringer("url", r.URL).
|
|
Int("status", status).
|
|
Int("size", size).
|
|
Dur("duration", duration).
|
|
Send()
|
|
}),
|
|
hlog.RemoteAddrHandler("ip"),
|
|
hlog.UserAgentHandler("user_agent"),
|
|
hlog.RefererHandler("referer"),
|
|
hlog.RequestIDHandler("req_id", "Request-Id"),
|
|
)
|
|
}
|