From 2e050160b5535e91fda411d7994a8a293410b716 Mon Sep 17 00:00:00 2001 From: Alexander NeonXP Kiryukhin Date: Sat, 6 Apr 2024 20:39:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BC?= =?UTF-8?q?=D0=B8=D0=B4=D0=B4=D0=BB=D0=B2=D0=B5=D0=B9=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logger.go | 33 ++++++++++++++++++++------------- recover.go | 44 +++++++++++++++++++++++--------------------- request_id.go | 4 ++-- use.go | 13 +++++++++++++ 4 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 use.go diff --git a/logger.go b/logger.go index 6a8ce7a..039bd19 100644 --- a/logger.go +++ b/logger.go @@ -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..., + ) + }) + } } diff --git a/recover.go b/recover.go index cbe12ac..6b5f2cb 100644 --- a/recover.go +++ b/recover.go @@ -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) + }) + } } diff --git a/request_id.go b/request_id.go index 67a0c82..b3650ef 100644 --- a/request_id.go +++ b/request_id.go @@ -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))) }) } diff --git a/use.go b/use.go new file mode 100644 index 0000000..6610e2f --- /dev/null +++ b/use.go @@ -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 +}