Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for ResponseHeaderModifier for HTTPRouteRule objects #1494

Closed
wants to merge 25 commits into from
Closed
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
333df3c
Add support for ResponseHeaderModifier for HTTPRouteRule objects
kevin85421 Jan 21, 2024
5cf3099
refactor validateFilterHeaderModifier
kevin85421 Jan 22, 2024
9d8188d
Rename ValidateRequestHeader to ValidateFilterHeader
kevin85421 Jan 22, 2024
0241709
Rename AddHeaders to AddHeaderDirectives
kevin85421 Jan 22, 2024
e159b03
Update servers_template.go
kevin85421 Jan 22, 2024
3d7e6bf
Pass conformance tests
kevin85421 Feb 4, 2024
649d90e
Remove Map
kevin85421 Feb 4, 2024
4274622
Remove fmt.Printf
kevin85421 Feb 4, 2024
4bbc00f
Change TODO to FIXME
kevin85421 Feb 4, 2024
9fd5050
Address comments
kevin85421 Feb 19, 2024
95e6039
Address comments
kevin85421 Feb 19, 2024
629ee12
Address comments
kevin85421 Feb 19, 2024
bcfa113
Address comments
kevin85421 Feb 19, 2024
d8b35c0
Address comments
kevin85421 Feb 19, 2024
d316a41
Address comments
kevin85421 Feb 19, 2024
9bf3447
Address comments
kevin85421 Feb 20, 2024
5fed90d
Merge remote-tracking branch 'upstream/main' into ResponseHeaderModifier
kevin85421 Feb 20, 2024
33e185b
Add HTTPRouteResponseHeaderModification to the conformance tests
kevin85421 Feb 20, 2024
c0f98ab
Add support for ResponseHeaderModifier for HTTPRouteRule objects
kevin85421 Feb 20, 2024
169aa1a
Merge remote-tracking branch 'upstream/main' into ResponseHeaderModifier
kevin85421 Feb 21, 2024
eef6224
Add support for ResponseHeaderModifier for HTTPRouteRule objects
kevin85421 Feb 25, 2024
a3eaa90
Add support for ResponseHeaderModifier for HTTPRouteRule objects
kevin85421 Feb 25, 2024
ddfd470
Merge remote-tracking branch 'upstream/main' into ResponseHeaderModifier
kevin85421 Feb 25, 2024
2213a64
Add support for ResponseHeaderModifier for HTTPRouteRule objects
kevin85421 Feb 25, 2024
12123fb
update
kevin85421 Mar 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion conformance/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ NGINX_PREFIX = $(PREFIX)/nginx
NGINX_PLUS_PREFIX ?= $(PREFIX)/nginx-plus
GW_API_VERSION ?= 1.0.0
GATEWAY_CLASS = nginx
SUPPORTED_FEATURES = HTTPRouteQueryParamMatching,HTTPRouteMethodMatching,HTTPRoutePortRedirect,HTTPRouteSchemeRedirect,HTTPRouteHostRewrite,HTTPRoutePathRewrite,GatewayPort8080
SUPPORTED_FEATURES = HTTPRouteQueryParamMatching,HTTPRouteMethodMatching,HTTPRoutePortRedirect,HTTPRouteSchemeRedirect,HTTPRouteHostRewrite,HTTPRoutePathRewrite,GatewayPort8080,HTTPRouteResponseHeaderModification
KIND_IMAGE ?= $(shell grep -m1 'FROM kindest/node' <tests/Dockerfile | awk -F'[ ]' '{print $$2}')
KIND_KUBE_CONFIG=$${HOME}/.kube/kind/config
CONFORMANCE_TAG = latest
Expand Down
8 changes: 8 additions & 0 deletions internal/mode/static/nginx/config/http/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type Location struct {
HTTPMatchVar string
Rewrites []string
ProxySetHeaders []Header
ResponseHeaders ResponseHeaders
}

// Header defines a HTTP header to be passed to the proxied server.
Expand All @@ -27,6 +28,13 @@ type Header struct {
Value string
}

// ResponseHeaders holds all response headers to be added, set, or removed.
type ResponseHeaders struct {
Add []Header
Set []Header
Remove []string
}

// Return represents an HTTP return.
type Return struct {
Body string
Expand Down
41 changes: 37 additions & 4 deletions internal/mode/static/nginx/config/servers.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,13 +247,15 @@ func updateLocationsForFilters(

rewrites := createRewritesValForRewriteFilter(filters.RequestURLRewrite, path)
proxySetHeaders := generateProxySetHeaders(&matchRule.Filters)
responseHeaders := generateResponseHeaders(&matchRule.Filters)
for i := range buildLocations {
if rewrites != nil {
if rewrites.Rewrite != "" {
buildLocations[i].Rewrites = append(buildLocations[i].Rewrites, rewrites.Rewrite)
}
}
buildLocations[i].ProxySetHeaders = proxySetHeaders
buildLocations[i].ResponseHeaders = responseHeaders
buildLocations[i].ProxySSLVerify = createProxyTLSFromBackends(matchRule.BackendGroup.Backends)
proxyPass := createProxyPass(
matchRule.BackendGroup,
Expand Down Expand Up @@ -517,11 +519,11 @@ func generateProxySetHeaders(filters *dataplane.HTTPFilters) []http.Header {
headerLen := len(headerFilter.Add) + len(headerFilter.Set) + len(headerFilter.Remove) + len(headers)
proxySetHeaders := make([]http.Header, 0, headerLen)
if len(headerFilter.Add) > 0 {
addHeaders := convertAddHeaders(headerFilter.Add)
addHeaders := createHeadersWithVarName(headerFilter.Add)
proxySetHeaders = append(proxySetHeaders, addHeaders...)
}
if len(headerFilter.Set) > 0 {
setHeaders := convertSetHeaders(headerFilter.Set)
setHeaders := createHeaders(headerFilter.Set)
proxySetHeaders = append(proxySetHeaders, setHeaders...)
}
// If the value of a header field is an empty string then this field will not be passed to a proxied server
Expand All @@ -535,7 +537,38 @@ func generateProxySetHeaders(filters *dataplane.HTTPFilters) []http.Header {
return append(proxySetHeaders, headers...)
}

func convertAddHeaders(headers []dataplane.HTTPHeader) []http.Header {
func generateResponseHeaders(filters *dataplane.HTTPFilters) http.ResponseHeaders {
if filters == nil || filters.ResponseHeaderModifiers == nil {
return http.ResponseHeaders{
kevin85421 marked this conversation as resolved.
Show resolved Hide resolved
Add: []http.Header{},
Set: []http.Header{},
Remove: []string{},
}
}

headerFilter := filters.ResponseHeaderModifiers
responseAddHeaders := make([]http.Header, 0, len(headerFilter.Add))
responseSetHeaders := make([]http.Header, 0, len(headerFilter.Set))
responseRemoveHeaders := make([]string, len(headerFilter.Remove))
kevin85421 marked this conversation as resolved.
Show resolved Hide resolved
if len(headerFilter.Add) > 0 {
addHeaders := createHeaders(headerFilter.Add)
responseAddHeaders = append(responseAddHeaders, addHeaders...)
kevin85421 marked this conversation as resolved.
Show resolved Hide resolved
}
if len(headerFilter.Set) > 0 {
setHeaders := createHeaders(headerFilter.Set)
responseSetHeaders = append(responseSetHeaders, setHeaders...)
}
// Make a deep copy to prevent the slice from being accidentally modified.
copy(responseRemoveHeaders, headerFilter.Remove)

return http.ResponseHeaders{
Add: responseAddHeaders,
Set: responseSetHeaders,
Remove: responseRemoveHeaders,
}
}

func createHeadersWithVarName(headers []dataplane.HTTPHeader) []http.Header {
locHeaders := make([]http.Header, 0, len(headers))
for _, h := range headers {
mapVarName := "${" + generateAddHeaderMapVariableName(h.Name) + "}"
Expand All @@ -547,7 +580,7 @@ func convertAddHeaders(headers []dataplane.HTTPHeader) []http.Header {
return locHeaders
}

func convertSetHeaders(headers []dataplane.HTTPHeader) []http.Header {
func createHeaders(headers []dataplane.HTTPHeader) []http.Header {
locHeaders := make([]http.Header, 0, len(headers))
for _, h := range headers {
locHeaders = append(locHeaders, http.Header{
Expand Down
10 changes: 10 additions & 0 deletions internal/mode/static/nginx/config/servers_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@ server {
{{ range $h := $l.ProxySetHeaders }}
proxy_set_header {{ $h.Name }} "{{ $h.Value }}";
{{- end }}
{{ range $h := $l.ResponseHeaders.Add }}
add_header {{ $h.Name }} "{{ $h.Value }}" always;
{{- end }}
{{ range $h := $l.ResponseHeaders.Set }}
proxy_hide_header {{ $h.Name }};
add_header {{ $h.Name }} "{{ $h.Value }}" always;
{{- end }}
{{ range $h := $l.ResponseHeaders.Remove }}
proxy_hide_header {{ $h }};
{{- end }}
proxy_http_version 1.1;
proxy_pass {{ $l.ProxyPass }};
{{- if $l.ProxySSLVerify }}
Expand Down
Loading