From 819a13f22d54f673bb2f0be696f102966da39add Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Wed, 8 Jan 2025 15:07:01 +0000 Subject: [PATCH] Apply predicate to BufferingClientHttpRequestFactory The bufferingPredicate configured in RestClient.Builder can and should also be used in the (existing) shouldBuffer protected method in BufferingClientHttpRequestFactory since the factory is no longer intended for direct use, and in any case the setting should apply in all cases including when there are no interceptors. See gh-33785 --- .../BufferingClientHttpRequestFactory.java | 31 +++++++++++++------ .../web/client/DefaultRestClient.java | 3 +- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/BufferingClientHttpRequestFactory.java b/spring-web/src/main/java/org/springframework/http/client/BufferingClientHttpRequestFactory.java index f7843a81bb0..9b24a49c014 100644 --- a/spring-web/src/main/java/org/springframework/http/client/BufferingClientHttpRequestFactory.java +++ b/spring-web/src/main/java/org/springframework/http/client/BufferingClientHttpRequestFactory.java @@ -20,6 +20,8 @@ import java.io.IOException; import java.net.URI; import java.util.function.BiPredicate; +import org.jspecify.annotations.Nullable; + import org.springframework.http.HttpMethod; /** @@ -38,26 +40,37 @@ import org.springframework.http.HttpMethod; */ public class BufferingClientHttpRequestFactory extends AbstractClientHttpRequestFactoryWrapper { + private final BiPredicate bufferingPredicate; + + /** * Create a buffering wrapper for the given {@link ClientHttpRequestFactory}. * @param requestFactory the target request factory to wrap */ public BufferingClientHttpRequestFactory(ClientHttpRequestFactory requestFactory) { + this(requestFactory, null); + } + + /** + * Constructor variant with an additional predicate to decide whether to + * buffer the response. + */ + public BufferingClientHttpRequestFactory( + ClientHttpRequestFactory requestFactory, + @Nullable BiPredicate bufferingPredicate) { + super(requestFactory); + this.bufferingPredicate = (bufferingPredicate != null ? bufferingPredicate : (uri, method) -> true); } + @Override - protected ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod, ClientHttpRequestFactory requestFactory) - throws IOException { + protected ClientHttpRequest createRequest( + URI uri, HttpMethod httpMethod, ClientHttpRequestFactory requestFactory) throws IOException { ClientHttpRequest request = requestFactory.createRequest(uri, httpMethod); - if (shouldBuffer(uri, httpMethod)) { - return new BufferingClientHttpRequestWrapper(request); - } - else { - return request; - } + return (shouldBuffer(uri, httpMethod) ? new BufferingClientHttpRequestWrapper(request) : request); } /** @@ -70,7 +83,7 @@ public class BufferingClientHttpRequestFactory extends AbstractClientHttpRequest * @return {@code true} if the exchange should be buffered; {@code false} otherwise */ protected boolean shouldBuffer(URI uri, HttpMethod httpMethod) { - return true; + return this.bufferingPredicate.test(uri, httpMethod); } } diff --git a/spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java b/spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java index 7158d6baf26..0c0a70ef740 100644 --- a/spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java +++ b/spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java @@ -656,7 +656,8 @@ final class DefaultRestClient implements RestClient { } } else if (DefaultRestClient.this.bufferingPredicate != null) { - factory = new BufferingClientHttpRequestFactory(DefaultRestClient.this.clientRequestFactory); + factory = new BufferingClientHttpRequestFactory( + DefaultRestClient.this.clientRequestFactory, DefaultRestClient.this.bufferingPredicate); } else { factory = DefaultRestClient.this.clientRequestFactory;