in pkg/ingress/kube/gateway/istio/conversion.go [193:283]
func convertHTTPRoute(r k8s.HTTPRouteRule, ctx configContext,
obj config.Config, pos int, enforceRefGrant bool,
) (*istio.HTTPRoute, *ConfigError) {
// TODO: implement rewrite, timeout, mirror, corspolicy, retries
vs := &istio.HTTPRoute{}
// Auto-name the route. If upstream defines an explicit name, will use it instead
// The position within the route is unique
// Start - Modified by Higress
// vs.Name = fmt.Sprintf("%s.%s.%d", obj.Namespace, obj.Name, pos)
// The best practice for Higress is to configure one HTTP route per route match.
vs.Name = generateRouteName(obj)
// End - Modified by Higress
for _, match := range r.Matches {
uri, err := createURIMatch(match)
if err != nil {
return nil, err
}
headers, err := createHeadersMatch(match)
if err != nil {
return nil, err
}
qp, err := createQueryParamsMatch(match)
if err != nil {
return nil, err
}
method, err := createMethodMatch(match)
if err != nil {
return nil, err
}
vs.Match = append(vs.Match, &istio.HTTPMatchRequest{
Uri: uri,
Headers: headers,
QueryParams: qp,
Method: method,
})
}
for _, filter := range r.Filters {
switch filter.Type {
case k8sbeta.HTTPRouteFilterRequestHeaderModifier:
h := createHeadersFilter(filter.RequestHeaderModifier)
if h == nil {
continue
}
if vs.Headers == nil {
vs.Headers = &istio.Headers{}
}
vs.Headers.Request = h
case k8sbeta.HTTPRouteFilterResponseHeaderModifier:
h := createHeadersFilter(filter.ResponseHeaderModifier)
if h == nil {
continue
}
if vs.Headers == nil {
vs.Headers = &istio.Headers{}
}
vs.Headers.Response = h
case k8sbeta.HTTPRouteFilterRequestRedirect:
vs.Redirect = createRedirectFilter(filter.RequestRedirect)
case k8sbeta.HTTPRouteFilterRequestMirror:
mirror, err := createMirrorFilter(ctx, filter.RequestMirror, obj.Namespace, enforceRefGrant)
if err != nil {
return nil, err
}
vs.Mirror = mirror
case k8sbeta.HTTPRouteFilterURLRewrite:
vs.Rewrite = createRewriteFilter(filter.URLRewrite)
default:
return nil, &ConfigError{
Reason: InvalidFilter,
Message: fmt.Sprintf("unsupported filter type %q", filter.Type),
}
}
}
if weightSum(r.BackendRefs) == 0 && vs.Redirect == nil {
// The spec requires us to return 500 when there are no >0 weight backends
vs.DirectResponse = &istio.HTTPDirectResponse{
Status: 500,
}
} else {
route, backendErr, err := buildHTTPDestination(ctx, r.BackendRefs, obj.Namespace, enforceRefGrant)
if err != nil {
return nil, err
}
vs.Route = route
return vs, backendErr
}
return vs, nil
}