authelia/internal/middlewares/bridge.go
James Elliott a50d425863
refactor(middlewares): convert the bridge to a builder (#3338)
This adjusts the bridge to be utilized as a builder in order to make it more reusable.
2022-06-10 11:34:43 +10:00

64 lines
1.7 KiB
Go

package middlewares
import (
"github.com/valyala/fasthttp"
"github.com/authelia/authelia/v4/internal/configuration/schema"
)
// NewBridgeBuilder creates a new BridgeBuilder.
func NewBridgeBuilder(config schema.Configuration, providers Providers) *BridgeBuilder {
return &BridgeBuilder{
config: config,
providers: providers,
}
}
// WithConfig sets the schema.Configuration used with this BridgeBuilder.
func (b *BridgeBuilder) WithConfig(config schema.Configuration) *BridgeBuilder {
b.config = config
return b
}
// WithProviders sets the Providers used with this BridgeBuilder.
func (b *BridgeBuilder) WithProviders(providers Providers) *BridgeBuilder {
b.providers = providers
return b
}
// WithPreMiddlewares sets the Middleware's used with this BridgeBuilder which are applied before the actual Bridge.
func (b *BridgeBuilder) WithPreMiddlewares(middlewares ...Middleware) *BridgeBuilder {
b.preMiddlewares = middlewares
return b
}
// WithPostMiddlewares sets the AutheliaMiddleware's used with this BridgeBuilder which are applied after the actual
// Bridge.
func (b *BridgeBuilder) WithPostMiddlewares(middlewares ...AutheliaMiddleware) *BridgeBuilder {
b.postMiddlewares = middlewares
return b
}
// Build and return the Bridge configured by this BridgeBuilder.
func (b *BridgeBuilder) Build() Bridge {
return func(next RequestHandler) fasthttp.RequestHandler {
for i := len(b.postMiddlewares) - 1; i >= 0; i-- {
next = b.postMiddlewares[i](next)
}
bridge := func(requestCtx *fasthttp.RequestCtx) {
next(NewAutheliaCtx(requestCtx, b.config, b.providers))
}
for i := len(b.preMiddlewares) - 1; i >= 0; i-- {
bridge = b.preMiddlewares[i](bridge)
}
return bridge
}
}