mirror of
https://github.com/safing/portbase
synced 2025-09-02 02:29:59 +00:00
Improve api middlewares
This commit is contained in:
parent
1cb93512f1
commit
d6f7a159ad
3 changed files with 33 additions and 6 deletions
|
@ -48,7 +48,7 @@ func (lrw *LoggingResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
log.Infof("api request: %s HIJ %s", lrw.Request.RemoteAddr, lrw.Request.RequestURI)
|
log.Tracer(lrw.Request.Context()).Infof("api request: %s HIJ %s", lrw.Request.RemoteAddr, lrw.Request.RequestURI)
|
||||||
return c, b, nil
|
return c, b, nil
|
||||||
}
|
}
|
||||||
return nil, nil, errors.New("response does not implement http.Hijacker")
|
return nil, nil, errors.New("response does not implement http.Hijacker")
|
||||||
|
@ -57,12 +57,12 @@ func (lrw *LoggingResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error)
|
||||||
// RequestLogger is a logging middleware.
|
// RequestLogger is a logging middleware.
|
||||||
func RequestLogger(next http.Handler) http.Handler {
|
func RequestLogger(next http.Handler) http.Handler {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
log.Tracef("api request: %s ___ %s", r.RemoteAddr, r.RequestURI)
|
log.Tracer(r.Context()).Tracef("api request: %s ___ %s", r.RemoteAddr, r.RequestURI)
|
||||||
lrw := NewLoggingResponseWriter(w, r)
|
lrw := NewLoggingResponseWriter(w, r)
|
||||||
next.ServeHTTP(lrw, r)
|
next.ServeHTTP(lrw, r)
|
||||||
if lrw.Status != 0 {
|
if lrw.Status != 0 {
|
||||||
// request may have been hijacked
|
// request may have been hijacked
|
||||||
log.Infof("api request: %s %d %s", lrw.Request.RemoteAddr, lrw.Status, lrw.Request.RequestURI)
|
log.Tracer(r.Context()).Infof("api request: %s %d %s", lrw.Request.RemoteAddr, lrw.Status, lrw.Request.RequestURI)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
package api
|
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.
|
// Middleware is a function that can be added as a middleware to the API endpoint.
|
||||||
type Middleware func(next http.Handler) http.Handler
|
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
|
handler := mwh.final
|
||||||
|
|
||||||
// build middleware chain
|
// build middleware chain
|
||||||
for _, mw := range mwh.handlers {
|
// loop in reverse to build the handler chain in the correct order
|
||||||
handler = mw(handler)
|
for i := len(mwh.handlers) - 1; i >= 0; i-- {
|
||||||
|
handler = mwh.handlers[i](handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
// start
|
// start
|
||||||
handler.ServeHTTP(w, r)
|
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()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@ var (
|
||||||
middlewareHandler = &mwHandler{
|
middlewareHandler = &mwHandler{
|
||||||
final: mainMux,
|
final: mainMux,
|
||||||
handlers: []Middleware{
|
handlers: []Middleware{
|
||||||
|
ModuleWorker,
|
||||||
|
LogTracer,
|
||||||
RequestLogger,
|
RequestLogger,
|
||||||
authMiddleware,
|
authMiddleware,
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Reference in a new issue