diff --git a/control-plane/api-gateway/common/translation.go b/control-plane/api-gateway/common/translation.go index 248d841270..8fbf1b92b7 100644 --- a/control-plane/api-gateway/common/translation.go +++ b/control-plane/api-gateway/common/translation.go @@ -279,46 +279,64 @@ func (t ResourceTranslator) translateHTTPQueryMatch(match gwv1beta1.HTTPQueryPar } func (t ResourceTranslator) translateHTTPFilters(filters []gwv1beta1.HTTPRouteFilter, resourceMap *ResourceMap, namespace string) (api.HTTPFilters, api.HTTPResponseFilters) { - var urlRewrite *api.URLRewrite - // TODO Consider only setting a filter on the resulting Consul config entry - // if we encounter a gwb1beta1.HTTPRouteFilter that requires it - consulFilter := api.HTTPHeaderFilter{ - Add: make(map[string]string), - Set: make(map[string]string), - } - consulResponseFilter := api.HTTPHeaderFilter{ - Add: make(map[string]string), - Set: make(map[string]string), - } - var retryFilter *api.RetryFilter - var timeoutFilter *api.TimeoutFilter + var ( + urlRewrite *api.URLRewrite + retryFilter *api.RetryFilter + timeoutFilter *api.TimeoutFilter + requestHeaderFilters = []api.HTTPHeaderFilter{} + responseHeaderFilters = []api.HTTPHeaderFilter{} + ) // Convert Gateway API filters to portions of the Consul request and response filters. // Multiple filters applying the same or conflicting operations are allowed but may // result in unexpected behavior. for _, filter := range filters { if filter.RequestHeaderModifier != nil { - consulFilter.Remove = append(consulFilter.Remove, filter.RequestHeaderModifier.Remove...) + newFilter := api.HTTPHeaderFilter{} + + if len(filter.RequestHeaderModifier.Remove) > 0 { + newFilter.Remove = append(newFilter.Remove, filter.RequestHeaderModifier.Remove...) + } - for _, toAdd := range filter.RequestHeaderModifier.Add { - consulFilter.Add[string(toAdd.Name)] = toAdd.Value + if len(filter.RequestHeaderModifier.Add) > 0 { + newFilter.Add = map[string]string{} + for _, toAdd := range filter.RequestHeaderModifier.Add { + newFilter.Add[string(toAdd.Name)] = toAdd.Value + } } - for _, toSet := range filter.RequestHeaderModifier.Set { - consulFilter.Set[string(toSet.Name)] = toSet.Value + if len(filter.RequestHeaderModifier.Set) > 0 { + newFilter.Set = map[string]string{} + for _, toSet := range filter.RequestHeaderModifier.Set { + newFilter.Set[string(toSet.Name)] = toSet.Value + } } + + requestHeaderFilters = append(requestHeaderFilters, newFilter) } if filter.ResponseHeaderModifier != nil { - consulResponseFilter.Remove = append(consulResponseFilter.Remove, filter.ResponseHeaderModifier.Remove...) + newFilter := api.HTTPHeaderFilter{} + + if len(filter.ResponseHeaderModifier.Remove) > 0 { + newFilter.Remove = append(newFilter.Remove, filter.ResponseHeaderModifier.Remove...) + } - for _, toAdd := range filter.ResponseHeaderModifier.Add { - consulResponseFilter.Add[string(toAdd.Name)] = toAdd.Value + if len(filter.ResponseHeaderModifier.Add) > 0 { + newFilter.Add = map[string]string{} + for _, toAdd := range filter.ResponseHeaderModifier.Add { + newFilter.Add[string(toAdd.Name)] = toAdd.Value + } } - for _, toSet := range filter.ResponseHeaderModifier.Set { - consulResponseFilter.Set[string(toSet.Name)] = toSet.Value + if len(filter.ResponseHeaderModifier.Set) > 0 { + newFilter.Set = map[string]string{} + for _, toSet := range filter.ResponseHeaderModifier.Set { + newFilter.Set[string(toSet.Name)] = toSet.Value + } } + + responseHeaderFilters = append(responseHeaderFilters, newFilter) } // we drop any path rewrites that are not prefix matches as we don't support those @@ -364,14 +382,14 @@ func (t ResourceTranslator) translateHTTPFilters(filters []gwv1beta1.HTTPRouteFi } requestFilter := api.HTTPFilters{ - Headers: []api.HTTPHeaderFilter{consulFilter}, + Headers: requestHeaderFilters, URLRewrite: urlRewrite, RetryFilter: retryFilter, TimeoutFilter: timeoutFilter, } responseFilter := api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{consulResponseFilter}, + Headers: responseHeaderFilters, } return requestFilter, responseFilter diff --git a/control-plane/api-gateway/common/translation_test.go b/control-plane/api-gateway/common/translation_test.go index 7e929917b3..94c78d1ee7 100644 --- a/control-plane/api-gateway/common/translation_test.go +++ b/control-plane/api-gateway/common/translation_test.go @@ -511,9 +511,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { }, URLRewrite: &api.URLRewrite{Path: "v1"}, }, - ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, - }, + ResponseFilters: api.HTTPResponseFilters{Headers: []api.HTTPHeaderFilter{}}, Matches: []api.HTTPMatch{ { Headers: []api.HTTPHeaderMatch{ @@ -558,10 +556,8 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { Path: "path", }, }, - ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, - }, - Weight: 45, + ResponseFilters: api.HTTPResponseFilters{Headers: []api.HTTPHeaderFilter{}}, + Weight: 45, }, }, }, @@ -722,7 +718,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { }, }, ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, }, Matches: []api.HTTPMatch{ { @@ -769,7 +765,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { }, }, ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, }, Weight: 45, }, @@ -940,7 +936,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { URLRewrite: &api.URLRewrite{Path: "v1"}, }, ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, }, Matches: []api.HTTPMatch{ { @@ -987,7 +983,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { }, }, ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, }, Weight: 45, }, @@ -1172,7 +1168,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { URLRewrite: &api.URLRewrite{Path: "v1"}, }, ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, }, Matches: []api.HTTPMatch{ { @@ -1202,9 +1198,9 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { Name: "some-override", Namespace: "svc-ns", Weight: 1, - Filters: api.HTTPFilters{Headers: []api.HTTPHeaderFilter{{Add: make(map[string]string), Set: make(map[string]string)}}}, + Filters: api.HTTPFilters{Headers: []api.HTTPHeaderFilter{}}, ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, }}, { Name: "service one", @@ -1227,7 +1223,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { }, }, ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, }, Weight: 45, }, @@ -1371,7 +1367,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { Rules: []api.HTTPRouteRule{ { Filters: api.HTTPFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, URLRewrite: nil, RetryFilter: &api.RetryFilter{ NumRetries: pointer.Uint32(3), @@ -1381,7 +1377,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { }, }, ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, }, Matches: []api.HTTPMatch{ { @@ -1411,7 +1407,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { Name: "service one", Weight: 45, Filters: api.HTTPFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, RetryFilter: &api.RetryFilter{ NumRetries: pointer.Uint32(3), RetryOn: []string{"cancelled"}, @@ -1420,7 +1416,7 @@ func TestTranslator_ToHTTPRoute(t *testing.T) { }, }, ResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{{Add: map[string]string{}, Set: map[string]string{}}}, + Headers: []api.HTTPHeaderFilter{}, }, Namespace: "other", }, @@ -1657,21 +1653,11 @@ func TestResourceTranslator_translateHTTPFilters(t1 *testing.T) { }, }, want: api.HTTPFilters{ - Headers: []api.HTTPHeaderFilter{ - { - Add: map[string]string{}, - Set: map[string]string{}, - }, - }, + Headers: []api.HTTPHeaderFilter{}, URLRewrite: nil, }, wantResponseFilters: api.HTTPResponseFilters{ - Headers: []api.HTTPHeaderFilter{ - { - Add: map[string]string{}, - Set: map[string]string{}, - }, - }, + Headers: []api.HTTPHeaderFilter{}, }, }, }