HTTPServer: Implement named middlewares (#44231)

* Implement named middlewares on http server

* Fix minor ordering issue with named middlewares
This commit is contained in:
Guilherme Caulada 2022-01-24 10:41:18 -03:00 committed by GitHub
parent 9161f9d2e1
commit 29268483c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 10 deletions

View File

@ -65,11 +65,12 @@ import (
)
type HTTPServer struct {
log log.Logger
web *web.Mux
context context.Context
httpSrv *http.Server
middlewares []web.Handler
log log.Logger
web *web.Mux
context context.Context
httpSrv *http.Server
middlewares []web.Handler
namedMiddlewares []routing.RegisterNamedMiddleware
PluginContextProvider *plugincontext.Provider
RouteRegister routing.RouteRegister
@ -214,6 +215,10 @@ func (hs *HTTPServer) AddMiddleware(middleware web.Handler) {
hs.middlewares = append(hs.middlewares, middleware)
}
func (hs *HTTPServer) AddNamedMiddleware(middleware routing.RegisterNamedMiddleware) {
hs.namedMiddlewares = append(hs.namedMiddlewares, middleware)
}
func (hs *HTTPServer) Run(ctx context.Context) error {
hs.context = ctx
@ -400,7 +405,7 @@ func (hs *HTTPServer) applyRoutes() {
// start with middlewares & static routes
hs.addMiddlewaresAndStaticRoutes()
// then add view routes & api routes
hs.RouteRegister.Register(hs.web)
hs.RouteRegister.Register(hs.web, hs.namedMiddlewares...)
// then custom app proxy routes
hs.initAppPluginRoutes(hs.web)
// lastly not found route

View File

@ -44,7 +44,7 @@ type RouteRegister interface {
// Register iterates over all routes added to the RouteRegister
// and add them to the `Router` pass as an parameter.
Register(Router)
Register(Router, ...RegisterNamedMiddleware)
// Reset resets the route register.
Reset()
@ -118,8 +118,13 @@ func (rr *RouteRegisterImpl) Group(pattern string, fn func(rr RouteRegister), ha
rr.groups = append(rr.groups, group)
}
func (rr *RouteRegisterImpl) Register(router Router) {
func (rr *RouteRegisterImpl) Register(router Router, namedMiddlewares ...RegisterNamedMiddleware) {
for _, r := range rr.routes {
// Add global named middlewares
for i, m := range namedMiddlewares {
r.handlers = insertHandler(r.handlers, len(rr.namedMiddlewares)+i, m(r.pattern))
}
// GET requests have to be added to macaron routing using Get()
// Otherwise HEAD requests will not be allowed.
// https://github.com/go-macaron/macaron/blob/a325110f8b392bce3e5cdeb8c44bf98078ada3be/router.go#L198
@ -131,7 +136,7 @@ func (rr *RouteRegisterImpl) Register(router Router) {
}
for _, g := range rr.groups {
g.Register(router)
g.Register(router, namedMiddlewares...)
}
}
@ -159,6 +164,15 @@ func (rr *RouteRegisterImpl) route(pattern, method string, handlers ...web.Handl
})
}
func insertHandler(a []web.Handler, index int, value web.Handler) []web.Handler {
if len(a) == index {
return append(a, value)
}
a = append(a[:index+1], a[index:]...)
a[index] = value
return a
}
func (rr *RouteRegisterImpl) Get(pattern string, handlers ...web.Handler) {
rr.route(pattern, http.MethodGet, handlers...)
}

View File

@ -73,6 +73,6 @@ func (noOpRouteRegister) Group(string, func(routing.RouteRegister), ...web.Handl
func (noOpRouteRegister) Insert(string, func(routing.RouteRegister), ...web.Handler) {}
func (noOpRouteRegister) Register(routing.Router) {}
func (noOpRouteRegister) Register(routing.Router, ...routing.RegisterNamedMiddleware) {}
func (noOpRouteRegister) Reset() {}