Preserve HTTPRoute filters order
This commit is contained in:
parent
ef5aa129c7
commit
eeb99c3536
3 changed files with 46 additions and 19 deletions
|
@ -301,36 +301,52 @@ func (p *Provider) loadHTTPBackendRef(namespace string, backendRef gatev1.HTTPBa
|
|||
}
|
||||
|
||||
func (p *Provider) loadMiddlewares(conf *dynamic.Configuration, namespace, routerName string, filters []gatev1.HTTPRouteFilter, pathMatch *gatev1.HTTPPathMatch) ([]string, error) {
|
||||
type namedMiddleware struct {
|
||||
Name string
|
||||
Config *dynamic.Middleware
|
||||
}
|
||||
|
||||
pm := ptr.Deref(pathMatch, gatev1.HTTPPathMatch{
|
||||
Type: ptr.To(gatev1.PathMatchPathPrefix),
|
||||
Value: ptr.To("/"),
|
||||
})
|
||||
|
||||
middlewares := make(map[string]*dynamic.Middleware)
|
||||
var middlewares []namedMiddleware
|
||||
for i, filter := range filters {
|
||||
name := fmt.Sprintf("%s-%s-%d", routerName, strings.ToLower(string(filter.Type)), i)
|
||||
|
||||
switch filter.Type {
|
||||
case gatev1.HTTPRouteFilterRequestRedirect:
|
||||
middlewares[name] = createRequestRedirect(filter.RequestRedirect, pm)
|
||||
middlewares = append(middlewares, namedMiddleware{
|
||||
name,
|
||||
createRequestRedirect(filter.RequestRedirect, pm),
|
||||
})
|
||||
|
||||
case gatev1.HTTPRouteFilterRequestHeaderModifier:
|
||||
middlewares[name] = createRequestHeaderModifier(filter.RequestHeaderModifier)
|
||||
middlewares = append(middlewares, namedMiddleware{
|
||||
name,
|
||||
createRequestHeaderModifier(filter.RequestHeaderModifier),
|
||||
})
|
||||
|
||||
case gatev1.HTTPRouteFilterExtensionRef:
|
||||
name, middleware, err := p.loadHTTPRouteFilterExtensionRef(namespace, filter.ExtensionRef)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("loading ExtensionRef filter %s: %w", filter.Type, err)
|
||||
}
|
||||
|
||||
middlewares[name] = middleware
|
||||
middlewares = append(middlewares, namedMiddleware{
|
||||
name,
|
||||
middleware,
|
||||
})
|
||||
|
||||
case gatev1.HTTPRouteFilterURLRewrite:
|
||||
var err error
|
||||
middleware, err := createURLRewrite(filter.URLRewrite, pm)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid filter %s: %w", filter.Type, err)
|
||||
}
|
||||
middlewares[name] = middleware
|
||||
middlewares = append(middlewares, namedMiddleware{
|
||||
name,
|
||||
middleware,
|
||||
})
|
||||
|
||||
default:
|
||||
// As per the spec: https://gateway-api.sigs.k8s.io/api-types/httproute/#filters-optional
|
||||
|
@ -342,12 +358,11 @@ func (p *Provider) loadMiddlewares(conf *dynamic.Configuration, namespace, route
|
|||
}
|
||||
|
||||
var middlewareNames []string
|
||||
for name, middleware := range middlewares {
|
||||
if middleware != nil {
|
||||
conf.HTTP.Middlewares[name] = middleware
|
||||
for _, m := range middlewares {
|
||||
if m.Config != nil {
|
||||
conf.HTTP.Middlewares[m.Name] = m.Config
|
||||
}
|
||||
|
||||
middlewareNames = append(middlewareNames, name)
|
||||
middlewareNames = append(middlewareNames, m.Name)
|
||||
}
|
||||
|
||||
return middlewareNames, nil
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue