@@ -294,6 +294,7 @@ func updateLocationsForFilters(
294
294
295
295
rewrites := createRewritesValForRewriteFilter (filters .RequestURLRewrite , path )
296
296
proxySetHeaders := generateProxySetHeaders (& matchRule .Filters , grpc )
297
+ responseHeaders := generateResponseHeaders (& matchRule .Filters )
297
298
for i := range buildLocations {
298
299
if rewrites != nil {
299
300
if rewrites .Rewrite != "" {
@@ -308,6 +309,7 @@ func updateLocationsForFilters(
308
309
generateProtocolString (buildLocations [i ].ProxySSLVerify , grpc ),
309
310
grpc ,
310
311
)
312
+ buildLocations [i ].ResponseHeaders = responseHeaders
311
313
buildLocations [i ].ProxyPass = proxyPass
312
314
buildLocations [i ].GRPC = grpc
313
315
}
@@ -578,11 +580,11 @@ func generateProxySetHeaders(filters *dataplane.HTTPFilters, grpc bool) []http.H
578
580
headerLen := len (headerFilter .Add ) + len (headerFilter .Set ) + len (headerFilter .Remove ) + len (headers )
579
581
proxySetHeaders := make ([]http.Header , 0 , headerLen )
580
582
if len (headerFilter .Add ) > 0 {
581
- addHeaders := convertAddHeaders (headerFilter .Add )
583
+ addHeaders := createHeadersWithVarName (headerFilter .Add )
582
584
proxySetHeaders = append (proxySetHeaders , addHeaders ... )
583
585
}
584
586
if len (headerFilter .Set ) > 0 {
585
- setHeaders := convertSetHeaders (headerFilter .Set )
587
+ setHeaders := createHeaders (headerFilter .Set )
586
588
proxySetHeaders = append (proxySetHeaders , setHeaders ... )
587
589
}
588
590
// If the value of a header field is an empty string then this field will not be passed to a proxied server
@@ -596,7 +598,25 @@ func generateProxySetHeaders(filters *dataplane.HTTPFilters, grpc bool) []http.H
596
598
return append (proxySetHeaders , headers ... )
597
599
}
598
600
599
- func convertAddHeaders (headers []dataplane.HTTPHeader ) []http.Header {
601
+ func generateResponseHeaders (filters * dataplane.HTTPFilters ) http.ResponseHeaders {
602
+ if filters == nil || filters .ResponseHeaderModifiers == nil {
603
+ return http.ResponseHeaders {}
604
+ }
605
+
606
+ headerFilter := filters .ResponseHeaderModifiers
607
+ responseRemoveHeaders := make ([]string , len (headerFilter .Remove ))
608
+
609
+ // Make a deep copy to prevent the slice from being accidentally modified.
610
+ copy (responseRemoveHeaders , headerFilter .Remove )
611
+
612
+ return http.ResponseHeaders {
613
+ Add : createHeaders (headerFilter .Add ),
614
+ Set : createHeaders (headerFilter .Set ),
615
+ Remove : responseRemoveHeaders ,
616
+ }
617
+ }
618
+
619
+ func createHeadersWithVarName (headers []dataplane.HTTPHeader ) []http.Header {
600
620
locHeaders := make ([]http.Header , 0 , len (headers ))
601
621
for _ , h := range headers {
602
622
mapVarName := "${" + generateAddHeaderMapVariableName (h .Name ) + "}"
@@ -608,7 +628,7 @@ func convertAddHeaders(headers []dataplane.HTTPHeader) []http.Header {
608
628
return locHeaders
609
629
}
610
630
611
- func convertSetHeaders (headers []dataplane.HTTPHeader ) []http.Header {
631
+ func createHeaders (headers []dataplane.HTTPHeader ) []http.Header {
612
632
locHeaders := make ([]http.Header , 0 , len (headers ))
613
633
for _ , h := range headers {
614
634
locHeaders = append (locHeaders , http.Header {
0 commit comments