From f998ca4f754db0be1a974af93c03d88d4e9a0cbb Mon Sep 17 00:00:00 2001 From: Abel Salgado Romero Date: Tue, 27 Sep 2022 19:38:50 +0200 Subject: [PATCH] Add support for URI variables --- ...uestHeadersIfNotPresentGatewayFilterFactory.java | 10 +++++++++- ...eadersIfNotPresentGatewayFilterFactoryTests.java | 13 +++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java index 4fec36b3..d47f16c6 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactory.java @@ -5,11 +5,13 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import reactor.core.publisher.Mono; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.core.style.ToStringCreator; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.util.StringUtils; @@ -60,7 +62,13 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactory if (requestBuilder == null) { requestBuilder = exchange.getRequest().mutate(); } - requestBuilder.headers(httpHeaders -> httpHeaders.addAll(headerName, kv.getValue())); + ServerWebExchange finalExchange = exchange; + requestBuilder.headers(httpHeaders -> { + List replacedValues = kv.getValue().stream() + .map(value -> ServerWebExchangeUtils.expand(finalExchange, value)) + .collect(Collectors.toList()); + httpHeaders.addAll(headerName, replacedValues); + }); } } if (requestBuilder != null) { diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java index 1a8d2084..3fdaa6ed 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/filter/factory/AddRequestHeadersIfNotPresentGatewayFilterFactoryTests.java @@ -95,7 +95,7 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base testClient.get().uri("/headers").header("Host", TEST_HOST_HEADER_VALUE).exchange().expectBody(Map.class) .consumeWith(result -> { Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Acme", "ValueB"); + assertThat(headers).containsEntry("X-Request-Acme", "ValueB-www"); }); } @@ -104,7 +104,7 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base testClient.get().uri("/multivalueheaders").header("Host", TEST_HOST_HEADER_VALUE).exchange() .expectBody(Map.class).consumeWith(result -> { Map headers = getMap(result.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Request-Acme", Arrays.asList("ValueX", "ValueY", "ValueZ")); + assertThat(headers).containsEntry("X-Request-Acme", Arrays.asList("ValueX", "ValueY", "ValueZ", "www")); }); } @@ -134,12 +134,13 @@ public class AddRequestHeadersIfNotPresentGatewayFilterFactoryTests extends Base public RouteLocator testRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("add_request_headers_if_not_present_java_test", - r -> r.path("/headers").and().host(TEST_HOST_HEADER_VALUE) - .filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueB")) + r -> r.path("/headers").and().host("{sub}.addrequestheaderjava.org") + .filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueB-{sub}")) .uri(uri)) .route("add_multiple_request_headers_java_test", - r -> r.path("/multivalueheaders").and().host(TEST_HOST_HEADER_VALUE) - .filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueX", "X-Request-Acme:ValueY", "X-Request-Acme:ValueZ")) + r -> r.path("/multivalueheaders").and().host("{sub}.addrequestheaderjava.org") + .filters(f -> f.addRequestHeadersIfNotPresent("X-Request-Acme:ValueX", "X-Request-Acme:ValueY", + "X-Request-Acme:ValueZ", "X-Request-Acme:{sub}")) .uri(uri)) .build(); }