diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java index 1243c1af..511893e7 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java @@ -181,7 +181,7 @@ public class NettyRoutingFilter implements GlobalFilter, Ordered { exchange.getAttributes().put(CLIENT_RESPONSE_HEADER_NAMES, filteredResponseHeaders.keySet()); - response.getHeaders().putAll(filteredResponseHeaders); + response.getHeaders().addAll(filteredResponseHeaders); return Mono.just(res); }); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterIntegrationTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterIntegrationTests.java index b1aec30e..5164949b 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterIntegrationTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/NettyRoutingFilterIntegrationTests.java @@ -132,6 +132,16 @@ public class NettyRoutingFilterIntegrationTests extends BaseWebClientTests { testClient.get().uri("/delay/2").exchange().expectStatus().isEqualTo(HttpStatus.OK); } + @Test + public void testHeadersAreClearedOnFallback() { + String header = "X-Test-SHOULD-MERGED-HEADER"; + String gatewayHeaderValue = "value-from-gateway"; + String upstreamHeaderValue = "value-from-upstream"; + testClient.post().uri("/responseheaders/200").header("Host", "www.mergeresponseheader.org") + .header(header, upstreamHeaderValue).exchange().expectHeader() + .valueEquals(header, gatewayHeaderValue, upstreamHeaderValue); + } + @EnableAutoConfiguration @SpringBootConfiguration @Import(DefaultTestConfig.class) diff --git a/spring-cloud-gateway-server/src/test/resources/application-netty-routing-filter.yml b/spring-cloud-gateway-server/src/test/resources/application-netty-routing-filter.yml index a8c2fdf7..8c25d969 100644 --- a/spring-cloud-gateway-server/src/test/resources/application-netty-routing-filter.yml +++ b/spring-cloud-gateway-server/src/test/resources/application-netty-routing-filter.yml @@ -60,6 +60,17 @@ spring: metadata: response-timeout: notANumber + # ===================================== + - id: per_route_merge_response_headers + uri: ${test.uri} + predicates: + - Host=**.mergeresponseheader.org + - Path=/responseheaders/** + filters: + - AddResponseHeader=X-Test-SHOULD-MERGED-HEADER, value-from-gateway + metadata: + response-timeout: 1000 + # ===================================== # should be last and not follow alphabetical order - id: default_path_to_httpbin