generated from datumforge/go-template
-
Notifications
You must be signed in to change notification settings - Fork 7
/
middleware.go
43 lines (36 loc) · 1.29 KB
/
middleware.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Package middleware provides middleware for http Handlers.
package middleware
import "net/http"
// A Chain is a middleware chain use for http request processing.
type Chain struct {
mw []MiddlewareFunc
}
// MiddlewareFunc is a function that acts as middleware for http Handlers.
type MiddlewareFunc func(next http.Handler) http.Handler
// NewChain creates a new Middleware chain
func NewChain(middlewares ...MiddlewareFunc) Chain {
return Chain{
mw: append([]MiddlewareFunc{}, middlewares...),
}
}
// Chain returns a http.Handler that chains the middleware onion-style around the handler.
func (c Chain) Chain(handler http.Handler) http.Handler {
for i := len(c.mw) - 1; i >= 0; i-- {
handler = c.mw[i](handler)
}
return handler
}
// Conditional is a middleware that only executes middleware if the condition
// returns true for the request. If the condition returns false, the middleware
// is skipped, and request handling moves on to the next handler in the chain.
func Conditional(middleware MiddlewareFunc, condition func(r *http.Request) bool) MiddlewareFunc {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
handler := next
if condition(r) {
handler = middleware(next)
}
handler.ServeHTTP(w, r)
})
}
}