From 2b4ffe03915187746c30d76f69c1f27bf1af0895 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Wed, 10 Jan 2024 20:39:14 +0000 Subject: [PATCH] Consistent inclusion of baseUrl in URI_TEMPLATE attribute Closes gh-31882 --- .../function/client/DefaultWebClient.java | 10 ++++--- .../client/DefaultWebClientTests.java | 27 ++++++++++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java index b3699ddb0e68..9518978298e0 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java @@ -231,14 +231,16 @@ public RequestBodySpec uri(String uriTemplate, Object... uriVariables) { @Override public RequestBodySpec uri(String uriTemplate, Map uriVariables) { - attribute(URI_TEMPLATE_ATTRIBUTE, uriTemplate); - return uri(uriBuilderFactory.expand(uriTemplate, uriVariables)); + UriBuilder uriBuilder = uriBuilderFactory.uriString(uriTemplate); + attribute(URI_TEMPLATE_ATTRIBUTE, uriBuilder.toUriString()); + return uri(uriBuilder.build(uriVariables)); } @Override public RequestBodySpec uri(String uriTemplate, Function uriFunction) { - attribute(URI_TEMPLATE_ATTRIBUTE, uriTemplate); - return uri(uriFunction.apply(uriBuilderFactory.uriString(uriTemplate))); + UriBuilder uriBuilder = uriBuilderFactory.uriString(uriTemplate); + attribute(URI_TEMPLATE_ATTRIBUTE, uriBuilder.toUriString()); + return uri(uriFunction.apply(uriBuilder)); } @Override diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultWebClientTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultWebClientTests.java index 244ddfd11146..189f0a233091 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultWebClientTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/DefaultWebClientTests.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; import org.junit.jupiter.api.BeforeEach; @@ -110,7 +111,7 @@ public void uriBuilderWithUriTemplate() { ClientRequest request = verifyAndGetRequest(); assertThat(request.url().toString()).isEqualTo("/base/path/identifier?q=12"); - assertThat(request.attribute(WebClient.class.getName() + ".uriTemplate")).contains("/path/{id}"); + assertThat(request.attribute(WebClient.class.getName() + ".uriTemplate")).contains("/base/path/{id}"); } @Test @@ -363,6 +364,30 @@ public void withNullAttribute() { assertThat(request.attribute("foo")).isNotPresent(); } + @Test + public void uriTemplateAttribute() { + testUriTemplateAttribute(client -> client.get().uri("/{id}", 1), "/base/{id}"); + testUriTemplateAttribute(client -> client.get().uri("/{id}", Map.of("id", 1)), "/base/{id}"); + testUriTemplateAttribute(client -> client.get().uri("/{id}", builder -> builder.build(1)), "/base/{id}"); + } + + private void testUriTemplateAttribute( + Function> requestFn, String expectedPath) { + + Map actual = new HashMap<>(); + ExchangeFilterFunction filter = (request, next) -> { + actual.putAll(request.attributes()); + return next.exchange(request); + }; + + requestFn.apply(this.builder.filter(filter).build()) + .retrieve().bodyToMono(Void.class) + .block(Duration.ofSeconds(10)); + + String key = WebClient.class.getName() + ".uriTemplate"; + assertThat(actual.get(key)).isEqualTo(expectedPath); + } + @Test public void apply() { WebClient client = this.builder