diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactory.java index 1ad67269..f2b54397 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactory.java @@ -37,7 +37,9 @@ public class AddRequestHeaderGatewayFilterFactory extends AbstractNameValueGatew @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { String value = ServerWebExchangeUtils.expand(exchange, config.getValue()); - ServerHttpRequest request = exchange.getRequest().mutate().header(config.getName(), value).build(); + ServerHttpRequest request = exchange.getRequest().mutate() + .headers(httpHeaders -> httpHeaders.add(config.getName(), value)) + .build(); return chain.filter(exchange.mutate().request(request).build()); } diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactoryTests.java index b041f702..389b9221 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeaderGatewayFilterFactoryTests.java @@ -16,6 +16,7 @@ package org.springframework.cloud.gateway.filter.factory; +import java.util.Arrays; import java.util.Map; import org.junit.Test; @@ -59,6 +60,18 @@ public class AddRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTest }); } + @Test + public void addRequestHeaderFilterWorksMultipleValues() { + testClient.get().uri("/multivalueheaders") + .header("Host", "www.addrequestheader.org").exchange() + .expectBody(Map.class).consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), + "headers"); + assertThat(headers).containsEntry("X-Request-Example", + Arrays.asList("ValueA", "ValueB")); + }); + } + @Test public void addRequestHeaderFilterWorksJavaDsl() { testClient.get().uri("/headers").header("Host", "www.addrequestheaderjava.org").exchange().expectBody(Map.class) @@ -68,6 +81,18 @@ public class AddRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTest }); } + @Test + public void addRequestHeaderFilterMultipleValuesWorksJavaDsl() { + testClient.get().uri("/multivalueheaders") + .header("Host", "www.addrequestheaderjava.org").exchange() + .expectBody(Map.class).consumeWith(result -> { + Map headers = getMap(result.getResponseBody(), + "headers"); + assertThat(headers).containsEntry("X-Request-Acme", + Arrays.asList("ValueB-www", "ValueC-www")); + }); + } + @Test public void toStringFormat() { NameValueConfig config = new NameValueConfig().setName("myname").setValue("myvalue"); @@ -89,6 +114,13 @@ public class AddRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTest r -> r.path("/headers").and().host("{sub}.addrequestheaderjava.org") .filters(f -> f.prefixPath("/httpbin").addRequestHeader("X-Request-Acme", "ValueB-{sub}")) .uri(uri)) + .route("add_multiple_request_header_java_test", r -> r + .path("/multivalueheaders").and() + .host("{sub}.addrequestheaderjava.org") + .filters(f -> f.prefixPath("/httpbin") + .addRequestHeader("X-Request-Acme", "ValueB-{sub}") + .addRequestHeader("X-Request-Acme", "ValueC-{sub}")) + .uri(uri)) .build(); } diff --git a/spring-cloud-gateway-server/src/test/resources/application-request-header-web-filter.yml b/spring-cloud-gateway-server/src/test/resources/application-request-header-web-filter.yml index 3778f9a4..021ac0af 100644 --- a/spring-cloud-gateway-server/src/test/resources/application-request-header-web-filter.yml +++ b/spring-cloud-gateway-server/src/test/resources/application-request-header-web-filter.yml @@ -5,6 +5,13 @@ spring: - id: add_request_header_test uri: ${test.uri} predicates: - - Path=/headers + - Path=/headers filters: - - AddRequestHeader=X-Request-Example, ValueA + - AddRequestHeader=X-Request-Example, ValueA + - id: add_multiple_request_header_test + uri: ${test.uri} + predicates: + - Path=/multivalueheaders + filters: + - AddRequestHeader=X-Request-Example, ValueA + - AddRequestHeader=X-Request-Example, ValueB