From 779187e6ae92f65bda49b0829da521601b28fac2 Mon Sep 17 00:00:00 2001 From: Dennis Menge Date: Thu, 1 Oct 2020 17:20:07 +0200 Subject: [PATCH] Allows multiple values applied with AddRequestHeaderGatewayFilterFactory Fixes gh-1902 --- .../AddRequestHeaderGatewayFilterFactory.java | 2 +- ...equestHeaderGatewayFilterFactoryTests.java | 30 +++++++++++++++++-- .../application-request-header-web-filter.yml | 11 +++++-- 3 files changed, 38 insertions(+), 5 deletions(-) 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 b7a3708b..6966af70 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 @@ -40,7 +40,7 @@ public class AddRequestHeaderGatewayFilterFactory GatewayFilterChain chain) { String value = ServerWebExchangeUtils.expand(exchange, config.getValue()); ServerHttpRequest request = exchange.getRequest().mutate() - .header(config.getName(), value).build(); + .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 ddb8792c..4736f1dd 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; @@ -60,6 +61,16 @@ 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") @@ -70,6 +81,16 @@ 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") @@ -90,9 +111,14 @@ public class AddRequestHeaderGatewayFilterFactoryTests extends BaseWebClientTest public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes().route("add_request_header_java_test", r -> r.path("/headers").and().host("{sub}.addrequestheaderjava.org") - .filters(f -> f.prefixPath("/httpbin") - .addRequestHeader("X-Request-Acme", "ValueB-{sub}")) + .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