Merge branch '6.1.x'

This commit is contained in:
Brian Clozel 2024-05-02 16:01:56 +02:00
commit 09ca4cdc70
3 changed files with 48 additions and 3 deletions

View File

@ -30,6 +30,8 @@ import org.apache.hc.core5.http.ClassicHttpRequest;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.Header;
import org.apache.hc.core5.http.HttpEntity;
import org.apache.hc.core5.http.Method;
import org.apache.hc.core5.http.io.entity.NullEntity;
import org.apache.hc.core5.http.protocol.HttpContext;
import org.springframework.http.HttpHeaders;
@ -89,8 +91,10 @@ final class HttpComponentsClientHttpRequest extends AbstractStreamingClientHttpR
addHeaders(this.httpRequest, headers);
if (body != null) {
HttpEntity requestEntity = new BodyEntity(headers, body);
this.httpRequest.setEntity(requestEntity);
this.httpRequest.setEntity(new BodyEntity(headers, body));
}
else if (!Method.isSafe(this.httpRequest.getMethod())) {
this.httpRequest.setEntity(NullEntity.INSTANCE);
}
ClassicHttpResponse httpResponse = this.httpClient.executeOpen(null, this.httpRequest, this.httpContext);
return new HttpComponentsClientHttpResponse(httpResponse);

View File

@ -106,6 +106,10 @@ public abstract class AbstractMockWebServerTests {
assertThat(request.getMethod()).isEqualTo(expectedMethod);
return new MockResponse();
}
else if(request.getPath().startsWith("/header/")) {
String headerName = request.getPath().replace("/header/","");
return new MockResponse().setBody(headerName + ":" + request.getHeader(headerName)).setResponseCode(200);
}
return new MockResponse().setResponseCode(404);
}
catch (Throwable exc) {

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -16,7 +16,9 @@
package org.springframework.http.client;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.stream.Stream;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.config.Configurable;
@ -26,8 +28,12 @@ import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.protocol.HttpClientContext;
import org.apache.hc.core5.util.Timeout;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.util.FileCopyUtils;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static org.assertj.core.api.Assertions.assertThat;
@ -37,6 +43,7 @@ import static org.mockito.Mockito.withSettings;
/**
* @author Stephane Nicoll
* @author Brian Clozel
*/
class HttpComponentsClientHttpRequestFactoryTests extends AbstractHttpRequestFactoryTests {
@ -145,6 +152,36 @@ class HttpComponentsClientHttpRequestFactoryTests extends AbstractHttpRequestFac
assertThat(requestConfig2.getConnectionRequestTimeout()).isEqualTo(Timeout.of(7000, MILLISECONDS));
}
@ParameterizedTest
@MethodSource("unsafeHttpMethods")
void shouldSetContentLengthWhenEmptyBody(HttpMethod method) throws Exception {
ClientHttpRequest request = factory.createRequest(URI.create(baseUrl + "/header/Content-Length"), method);
try (ClientHttpResponse response = request.execute()) {
assertThat(response.getStatusCode()).as("Invalid status code").isEqualTo(HttpStatus.OK);
String result = FileCopyUtils.copyToString(new InputStreamReader(response.getBody()));
assertThat(result).as("Invalid body").isEqualTo("Content-Length:0");
}
}
static Stream<HttpMethod> unsafeHttpMethods() {
return Stream.of(HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE, HttpMethod.PATCH);
}
@ParameterizedTest
@MethodSource("safeHttpMethods")
void shouldNotSetContentLengthWhenEmptyBodyAndSafeMethod(HttpMethod method) throws Exception {
ClientHttpRequest request = factory.createRequest(URI.create(baseUrl + "/header/Content-Length"), method);
try (ClientHttpResponse response = request.execute()) {
assertThat(response.getStatusCode()).as("Invalid status code").isEqualTo(HttpStatus.OK);
String result = FileCopyUtils.copyToString(new InputStreamReader(response.getBody()));
assertThat(result).as("Invalid body").isEqualTo("Content-Length:null");
}
}
static Stream<HttpMethod> safeHttpMethods() {
return Stream.of(HttpMethod.GET, HttpMethod.OPTIONS, HttpMethod.TRACE);
}
private RequestConfig retrieveRequestConfig(HttpComponentsClientHttpRequestFactory factory) throws Exception {
URI uri = URI.create(baseUrl + "/status/ok");
HttpComponentsClientHttpRequest request = (HttpComponentsClientHttpRequest)