Правки миддлвейров

This commit is contained in:
Alexander NeonXP Kiryukhin 2024-04-06 20:39:09 +03:00
parent e2509238d2
commit 2e050160b5
Signed by: NeonXP
GPG key ID: 35E33E1AB7776B39
4 changed files with 58 additions and 36 deletions

View file

@ -6,17 +6,24 @@ import (
"log/slog"
)
func Logger(handler http.Handler, logger *slog.Logger) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
handler.ServeHTTP(w, r)
requestID := GetRequestID(r)
logger.InfoContext(
r.Context(),
"request",
slog.String("proto", r.Proto),
slog.String("method", r.Method),
slog.String("request_uri", r.RequestURI),
slog.String("request_id", requestID),
)
})
func Logger(logger *slog.Logger) Middleware {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
next.ServeHTTP(w, r)
requestID := GetRequestID(r)
args := []any{
slog.String("proto", r.Proto),
slog.String("method", r.Method),
slog.String("request_uri", r.RequestURI),
}
if requestID != "" {
args = append(args, slog.String("request_id", requestID))
}
logger.InfoContext(
r.Context(),
"request",
args...,
)
})
}
}

View file

@ -7,26 +7,28 @@ import (
"log/slog"
)
func Recover(handler http.Handler, logger *slog.Logger) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
err := recover()
if err == nil {
return
}
debug.PrintStack()
requestID := GetRequestID(r)
logger.ErrorContext(
r.Context(),
"panic",
slog.Any("panic", err),
slog.String("proto", r.Proto),
slog.String("method", r.Method),
slog.String("request_uri", r.RequestURI),
slog.String("request_id", requestID),
)
}()
func Recover(logger *slog.Logger) Middleware {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
err := recover()
if err == nil {
return
}
debug.PrintStack()
requestID := GetRequestID(r)
logger.ErrorContext(
r.Context(),
"panic",
slog.Any("panic", err),
slog.String("proto", r.Proto),
slog.String("method", r.Method),
slog.String("request_uri", r.RequestURI),
slog.String("request_id", requestID),
)
}()
handler.ServeHTTP(w, r)
})
next.ServeHTTP(w, r)
})
}
}

View file

@ -14,14 +14,14 @@ const (
RequestIDHeader string = "X-Request-ID"
)
func RequestID(handler http.Handler) http.Handler {
func RequestID(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requestID := r.Header.Get(RequestIDHeader)
if requestID == "" {
requestID = uuid.NewString()
}
handler.ServeHTTP(w, r.WithContext(context.WithValue(r.Context(), RequestIDKey, requestID)))
next.ServeHTTP(w, r.WithContext(context.WithValue(r.Context(), RequestIDKey, requestID)))
})
}

13
use.go Normal file
View file

@ -0,0 +1,13 @@
package middleware
import "net/http"
type Middleware func(http.Handler) http.Handler
func Use(handler http.Handler, middlewares ...Middleware) http.Handler {
for _, h := range middlewares {
handler = h(handler)
}
return handler
}