diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpConnector.java b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpConnector.java index 94044b93b78..c1fc17f84ce 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpConnector.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpConnector.java @@ -68,6 +68,10 @@ public class ReactorClientHttpConnector implements ClientHttpConnector { public Mono connect(HttpMethod method, URI uri, Function> requestCallback) { + if (!uri.isAbsolute()) { + return Mono.error(new IllegalArgumentException("URI is not absolute: " + uri)); + } + return this.httpClient .request(adaptHttpMethod(method), uri.toString(), diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java index dd26d193dee..d6109d6496b 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java @@ -568,6 +568,16 @@ public class WebClientIntegrationTests { }).verifyComplete(); } + @Test // SPR-15782 + public void absoluteUri() throws Exception { + String uri = "/api/v4/groups/1"; + Mono responseMono = WebClient.builder().build().get().uri(uri).exchange(); + + StepVerifier.create(responseMono) + .expectErrorMessage("URI is not absolute: " + uri) + .verify(Duration.ofSeconds(5)); + } + @SuppressWarnings("serial") private static class MyException extends RuntimeException {