diff --git a/internal/dataplane/parser/translate_httproute.go b/internal/dataplane/parser/translate_httproute.go index 9a701f5d4a..4ab3d2af53 100644 --- a/internal/dataplane/parser/translate_httproute.go +++ b/internal/dataplane/parser/translate_httproute.go @@ -440,9 +440,8 @@ func generatePluginsFromHTTPRouteFilters(filters []gatewayv1beta1.HTTPRouteFilte gatewayv1beta1.HTTPRouteFilterRequestMirror, gatewayv1beta1.HTTPRouteFilterResponseHeaderModifier, gatewayv1beta1.HTTPRouteFilterURLRewrite: - //not supported + // not supported } - } for _, p := range kongPlugins { p.Tags = tags diff --git a/internal/dataplane/parser/translate_httproute_test.go b/internal/dataplane/parser/translate_httproute_test.go index 1687efdc40..0f0c7a26f7 100644 --- a/internal/dataplane/parser/translate_httproute_test.go +++ b/internal/dataplane/parser/translate_httproute_test.go @@ -10,6 +10,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" gatewayv1beta1 "sigs.k8s.io/gateway-api/apis/v1beta1" @@ -1352,6 +1353,96 @@ func TestGetHTTPRouteHostnamesAsSliceOfStringPointers(t *testing.T) { } } +func TestGeneratePluginsFromHTTPRouteFilters(t *testing.T) { + testCases := []struct { + name string + filters []gatewayv1beta1.HTTPRouteFilter + path string + expectedPlugins []kong.Plugin + }{ + { + name: "no filters", + filters: []gatewayv1beta1.HTTPRouteFilter{}, + expectedPlugins: []kong.Plugin{}, + }, + { + name: "request header modifier", + filters: []gatewayv1beta1.HTTPRouteFilter{ + { + Type: gatewayv1beta1.HTTPRouteFilterRequestHeaderModifier, + RequestHeaderModifier: &gatewayv1beta1.HTTPHeaderFilter{ + Set: []gatewayv1beta1.HTTPHeader{ + { + Name: "header-to-set", + Value: "bar", + }, + }, + Remove: []string{"header-to-remove"}, + }, + }, + }, + expectedPlugins: []kong.Plugin{ + { + Name: kong.String("request-transformer"), + Config: kong.Configuration{ + "add": map[string][]string{ + "headers": { + "header-to-set:bar", + }, + }, + "remove": map[string][]string{ + "headers": { + "header-to-remove", + }, + }, + "replace": map[string][]string{ + "headers": { + "header-to-set:bar", + }, + }, + }, + }, + }, + }, + { + name: "request redirect modifier", + filters: []gatewayv1beta1.HTTPRouteFilter{ + { + Type: gatewayv1beta1.HTTPRouteFilterRequestRedirect, + RequestRedirect: &gatewayv1beta1.HTTPRequestRedirectFilter{ + Hostname: (*gatewayv1beta1.PreciseHostname)(pointer.String("example.org")), + StatusCode: pointer.Int(302), + }, + }, + }, + path: "/test", + expectedPlugins: []kong.Plugin{ + { + Name: kong.String("request-termination"), + Config: kong.Configuration{ + "status_code": pointer.Int(302), + }, + }, + { + Name: kong.String("response-transformer"), + Config: kong.Configuration{ + "add": map[string][]string{ + "headers": { + "Location: http://example.org:80/test", + }, + }, + }, + }, + }, + }, + } + + for _, tc := range testCases { + plugins := generatePluginsFromHTTPRouteFilters(tc.filters, tc.path, nil) + assert.Equal(t, tc.expectedPlugins, plugins, tc.name) + } +} + func TestIngressRulesFromHTTPRoutes_RegexPrefix(t *testing.T) { fakestore, err := store.NewFakeStore(store.FakeObjects{}) require.NoError(t, err)