🧑💻 Created middleware package
This commit is contained in:
parent
cde901b708
commit
f9ab36076a
|
@ -0,0 +1,44 @@
|
|||
package middleware
|
||||
|
||||
import "net/http"
|
||||
|
||||
type (
|
||||
// Interceptor intercepts an HTTP handler invocation, it is passed both
|
||||
// response writer and request which after interception can be passed
|
||||
// onto the handler function.
|
||||
Interceptor func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc)
|
||||
|
||||
// HandlerFunc builds on top of http.HandlerFunc, and exposes API to
|
||||
// intercept with Interceptor. This allows building complex long chains
|
||||
// without complicated struct manipulation.
|
||||
HandlerFunc http.HandlerFunc
|
||||
|
||||
// Chain is a collection of interceptors that will be invoked in there
|
||||
// index order.
|
||||
Chain []Interceptor
|
||||
|
||||
// Skipper is a requests checker for middleware configurations. true
|
||||
// return force middleware to skip any actions with current request.
|
||||
Skipper func(r *http.Request) bool
|
||||
)
|
||||
|
||||
var DefaultSkipper Skipper = func(_ *http.Request) bool { return false }
|
||||
|
||||
// Intercept returns back a continuation that will call install middleware to
|
||||
// intercept the continuation call.
|
||||
func (hf HandlerFunc) Intercept(i Interceptor) HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
i(w, r, http.HandlerFunc(hf))
|
||||
}
|
||||
}
|
||||
|
||||
// Handler allows hooking multiple middleware in single call.
|
||||
func (c Chain) Handler(hf http.HandlerFunc) http.Handler {
|
||||
current := HandlerFunc(hf)
|
||||
|
||||
for i := len(c) - 1; i >= 0; i-- {
|
||||
current = current.Intercept(c[i])
|
||||
}
|
||||
|
||||
return http.HandlerFunc(current)
|
||||
}
|
Loading…
Reference in New Issue