@@ -3,15 +3,34 @@ package http
33import (
44 "context"
55 "net/http"
6+ "strings"
67 "time"
78
89 "github.com/armon/go-metrics"
9- "github.com/go-chi/chi/v5"
1010 "github.com/robherley/snips.sh/internal/id"
1111 "github.com/robherley/snips.sh/internal/logger"
1212 "github.com/rs/zerolog/log"
1313)
1414
15+ type Middleware func (next http.Handler ) http.Handler
16+
17+ var DefaultMiddleware = []Middleware {
18+ WithRecover ,
19+ WithMetrics ,
20+ WithLogger ,
21+ WithRequestID ,
22+ }
23+
24+ func WithMiddleware (handler http.Handler , middlewares ... Middleware ) http.Handler {
25+ middlewares = append (DefaultMiddleware , middlewares ... )
26+
27+ withMiddleware := handler
28+ for i := range middlewares {
29+ withMiddleware = middlewares [i ](withMiddleware )
30+ }
31+ return withMiddleware
32+ }
33+
1534// WithRequestID adds a unique request ID to the request context.
1635func WithRequestID (next http.Handler ) http.Handler {
1736 return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
@@ -40,9 +59,10 @@ func WithLogger(next http.Handler) http.Handler {
4059 ctx := context .WithValue (r .Context (), logger .ContextKey , & reqLog )
4160 reqLog .Info ().Msg ("connected" )
4261
43- next .ServeHTTP (w , r .WithContext (ctx ))
62+ r = r .WithContext (ctx )
63+ next .ServeHTTP (w , r )
4464
45- reqLog .Info ().Dur ("dur" , time .Since (start )).Msg ("disconnected" )
65+ reqLog .Info ().Dur ("dur" , time .Since (start )).Str ( "pattern" , Pattern ( r )). Msg ("disconnected" )
4666 })
4767}
4868
@@ -65,19 +85,21 @@ func WithMetrics(next http.Handler) http.Handler {
6585 start := time .Now ()
6686 next .ServeHTTP (w , r )
6787
68- rctx := chi .RouteContext (r .Context ())
69- pattern := rctx .RoutePattern ()
70- if pattern == "" {
71- // empty pattern, didn't match router e.g. 404
72- pattern = "*"
73- }
74-
7588 labels := []metrics.Label {
76- {Name : "path " , Value : pattern },
89+ {Name : "pattern " , Value : Pattern ( r ) },
7790 {Name : "method" , Value : r .Method },
7891 }
7992
8093 metrics .IncrCounterWithLabels ([]string {"http" , "request" }, 1 , labels )
8194 metrics .MeasureSinceWithLabels ([]string {"http" , "request" , "duration" }, start , labels )
8295 })
8396}
97+
98+ func Pattern (r * http.Request ) string {
99+ pattern := strings .TrimPrefix (r .Pattern , r .Method + " " )
100+ if pattern == "" {
101+ // empty pattern, didn't match router e.g. 404
102+ pattern = "*"
103+ }
104+ return pattern
105+ }
0 commit comments