mirror of
https://github.com/safing/portbase
synced 2025-09-09 13:55:47 +00:00
Improve api middlewares
This commit is contained in:
parent
1cb93512f1
commit
d6f7a159ad
3 changed files with 33 additions and 6 deletions
|
@ -1,6 +1,11 @@
|
|||
package api
|
||||
|
||||
import "net/http"
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"github.com/safing/portbase/log"
|
||||
)
|
||||
|
||||
// Middleware is a function that can be added as a middleware to the API endpoint.
|
||||
type Middleware func(next http.Handler) http.Handler
|
||||
|
@ -18,10 +23,30 @@ func (mwh *mwHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||
handler := mwh.final
|
||||
|
||||
// build middleware chain
|
||||
for _, mw := range mwh.handlers {
|
||||
handler = mw(handler)
|
||||
// loop in reverse to build the handler chain in the correct order
|
||||
for i := len(mwh.handlers) - 1; i >= 0; i-- {
|
||||
handler = mwh.handlers[i](handler)
|
||||
}
|
||||
|
||||
// start
|
||||
handler.ServeHTTP(w, r)
|
||||
}
|
||||
|
||||
// ModuleWorker is an http middleware that wraps the request in a module worker.
|
||||
func ModuleWorker(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
_ = module.RunWorker("http request", func(_ context.Context) error {
|
||||
next.ServeHTTP(w, r)
|
||||
return nil
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// LogTracer is an http middleware that attaches a log tracer to the request context.
|
||||
func LogTracer(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx, tracer := log.AddTracer(r.Context())
|
||||
next.ServeHTTP(w, r.WithContext(ctx))
|
||||
tracer.Submit()
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue