53 lines
1.5 KiB
Go
53 lines
1.5 KiB
Go
// Package middleware provides methods to analyze and mutate data delivered over
|
|
// HTTP.
|
|
package middleware
|
|
|
|
import (
|
|
"net/http"
|
|
)
|
|
|
|
type (
|
|
// BeforeFunc is an alias of http.HandlerFunc to execute its own
|
|
// logic before middleware.
|
|
BeforeFunc = http.HandlerFunc
|
|
|
|
// Chain describes the middlewares call chain.
|
|
Chain []Interceptor
|
|
|
|
// Interceptor describes the middleware contract.
|
|
Interceptor func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc)
|
|
|
|
// HandlerFunc is an alias of http.HandlerFunc for the
|
|
// extension.
|
|
HandlerFunc http.HandlerFunc
|
|
|
|
// Skipper defines a function to skip middleware. Returning true skips
|
|
// processing the middleware.
|
|
Skipper func(w http.ResponseWriter, r *http.Request) bool
|
|
)
|
|
|
|
// DefaultSkipper is the default skipper, which always returns false.
|
|
//
|
|
//nolint:gochecknoglobals
|
|
var DefaultSkipper Skipper = func(w http.ResponseWriter, r *http.Request) bool { return false }
|
|
|
|
// Intercept wraps the HandlerFunc in middleware input.
|
|
func (count HandlerFunc) Intercept(middleware Interceptor) HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
middleware(w, r, http.HandlerFunc(count))
|
|
}
|
|
}
|
|
|
|
// Handler wraps the input into the middlewares chain starting from the
|
|
// last to first and returns http.Handler.
|
|
func (chain Chain) Handler(handler http.HandlerFunc) http.Handler {
|
|
current := HandlerFunc(handler)
|
|
|
|
for i := len(chain) - 1; i >= 0; i-- {
|
|
m := chain[i]
|
|
current = current.Intercept(m)
|
|
}
|
|
|
|
return http.HandlerFunc(current)
|
|
}
|