diff --git a/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java index 4c0ad05f99a..d8f536e0be8 100644 --- a/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/JdkClientHttpRequest.java @@ -149,38 +149,38 @@ class JdkClientHttpRequest extends AbstractStreamingClientHttpRequest { } }); - switch (this.method.name()) { - case "GET" : - builder.GET(); - break; - case "DELETE" : - builder.DELETE(); - break; - default : - builder.method(this.method.name(), bodyPublisher(headers, body)); + if (body != null) { + builder.method(this.method.name(), bodyPublisher(headers, body)); + } + else { + switch (this.method.name()) { + case "GET" : + builder.GET(); + break; + case "DELETE" : + builder.DELETE(); + break; + default : + builder.method(this.method.name(), HttpRequest.BodyPublishers.noBody()); + } } return builder.build(); } - private HttpRequest.BodyPublisher bodyPublisher(HttpHeaders headers, @Nullable Body body) { - if (body != null) { - Flow.Publisher publisher = new OutputStreamPublisher<>( - os -> body.writeTo(StreamUtils.nonClosing(os)), BYTE_MAPPER, this.executor, null); + private HttpRequest.BodyPublisher bodyPublisher(HttpHeaders headers, Body body) { + Flow.Publisher publisher = new OutputStreamPublisher<>( + os -> body.writeTo(StreamUtils.nonClosing(os)), BYTE_MAPPER, this.executor, null); - long contentLength = headers.getContentLength(); - if (contentLength > 0) { - return HttpRequest.BodyPublishers.fromPublisher(publisher, contentLength); - } - else if (contentLength == 0) { - return HttpRequest.BodyPublishers.noBody(); - } - else { - return HttpRequest.BodyPublishers.fromPublisher(publisher); - } + long contentLength = headers.getContentLength(); + if (contentLength > 0) { + return HttpRequest.BodyPublishers.fromPublisher(publisher, contentLength); } - else { + else if (contentLength == 0) { return HttpRequest.BodyPublishers.noBody(); } + else { + return HttpRequest.BodyPublishers.fromPublisher(publisher); + } } /** diff --git a/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java b/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java index 66c531daf0d..025f47e0c44 100644 --- a/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java +++ b/spring-web/src/test/java/org/springframework/http/client/JdkClientHttpRequestFactoryTests.java @@ -96,10 +96,21 @@ class JdkClientHttpRequestFactoryTests extends AbstractHttpRequestFactoryTests { } } + @Test // gh-35068 + void deleteRequestWithBody() throws Exception { + URI uri = URI.create(baseUrl + "/echo"); + ClientHttpRequest request = this.factory.createRequest(uri, HttpMethod.DELETE); + StreamUtils.copy("body", StandardCharsets.ISO_8859_1, request.getBody()); + try (ClientHttpResponse response = request.execute()) { + assertThat(response.getStatusCode()).as("Invalid response status").isEqualTo(HttpStatus.OK); + assertThat(StreamUtils.copyToString(response.getBody(), StandardCharsets.ISO_8859_1)) + .as("Invalid request body").isEqualTo("body"); + } + } @Test // gh-34971 @EnabledForJreRange(min = JRE.JAVA_19) // behavior fixed in Java 19 - void requestContentLengthHeader() throws Exception { + void requestContentLengthHeaderWhenNoBody() throws Exception { URI uri = URI.create(baseUrl + "/header/Content-Length"); assertNoContentLength(uri, HttpMethod.GET); assertNoContentLength(uri, HttpMethod.DELETE);