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;