Built-in buffering support in RestClient

Closes gh-33785
This commit is contained in:
rstoyanchev
2025-01-08 13:44:46 +00:00
parent 6a0c5ddf68
commit 27c4f0e29d
7 changed files with 136 additions and 16 deletions

View File

@@ -51,6 +51,7 @@ import org.springframework.http.client.JettyClientHttpRequestFactory;
import org.springframework.http.client.ReactorClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.testfixture.xml.Pojo;
@@ -811,6 +812,59 @@ class RestClientIntegrationTests {
expectRequest(request -> assertThat(request.getHeader("foo")).isEqualTo("bar"));
}
@ParameterizedRestClientTest
void requestInterceptorWithResponseBuffering(ClientHttpRequestFactory requestFactory) {
startServer(requestFactory);
prepareResponse(response ->
response.setHeader("Content-Type", "text/plain").setBody("Hello Spring!"));
RestClient interceptedClient = this.restClient.mutate()
.requestInterceptor((request, body, execution) -> {
ClientHttpResponse response = execution.execute(request, body);
byte[] result = FileCopyUtils.copyToByteArray(response.getBody());
assertThat(result).isEqualTo("Hello Spring!".getBytes(UTF_8));
return response;
})
.bufferContent((uri, httpMethod) -> true)
.build();
String result = interceptedClient.get()
.uri("/greeting")
.retrieve()
.body(String.class);
assertThat(result).isEqualTo("Hello Spring!");
expectRequestCount(1);
}
@ParameterizedRestClientTest
void bufferContent(ClientHttpRequestFactory requestFactory) {
startServer(requestFactory);
prepareResponse(response ->
response.setHeader("Content-Type", "text/plain").setBody("Hello Spring!"));
RestClient bufferingClient = this.restClient.mutate()
.bufferContent((uri, httpMethod) -> true)
.build();
String result = bufferingClient.get()
.uri("/greeting")
.exchange((request, response) -> {
byte[] bytes = FileCopyUtils.copyToByteArray(response.getBody());
assertThat(bytes).isEqualTo("Hello Spring!".getBytes(UTF_8));
bytes = FileCopyUtils.copyToByteArray(response.getBody());
assertThat(bytes).isEqualTo("Hello Spring!".getBytes(UTF_8));
return new String(bytes, UTF_8);
});
assertThat(result).isEqualTo("Hello Spring!");
expectRequestCount(1);
}
@ParameterizedRestClientTest
void retrieveDefaultCookiesAsCookieHeader(ClientHttpRequestFactory requestFactory) {
startServer(requestFactory);