Add support for URI variables

This commit is contained in:
Abel Salgado Romero
2022-09-27 19:38:50 +02:00
parent 5db6f63599
commit f998ca4f75
2 changed files with 16 additions and 7 deletions

View File

@@ -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<String> replacedValues = kv.getValue().stream()
.map(value -> ServerWebExchangeUtils.expand(finalExchange, value))
.collect(Collectors.toList());
httpHeaders.addAll(headerName, replacedValues);
});
}
}
if (requestBuilder != null) {

View File

@@ -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<String, Object> 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<String, Object> 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();
}