Add withDefaultRequestConfigManagerCustomizer method
Update `HttpComponentsClientHttpRequestFactoryBuilder` with a new `withDefaultRequestConfigManagerCustomizer` method, primarily to help disable the protocol upgrade setting. Closes gh-43139
This commit is contained in:
parent
b14a2a9afc
commit
87cf12a36c
|
@ -26,6 +26,7 @@ import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.classic.HttpClient;
|
import org.apache.hc.client5.http.classic.HttpClient;
|
||||||
|
import org.apache.hc.client5.http.config.RequestConfig;
|
||||||
import org.apache.hc.client5.http.impl.DefaultRedirectStrategy;
|
import org.apache.hc.client5.http.impl.DefaultRedirectStrategy;
|
||||||
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
|
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
|
||||||
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
|
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
|
||||||
|
@ -64,23 +65,33 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
|
||||||
|
|
||||||
private final Consumer<SocketConfig.Builder> socketConfigCustomizer;
|
private final Consumer<SocketConfig.Builder> socketConfigCustomizer;
|
||||||
|
|
||||||
|
private final Consumer<RequestConfig.Builder> defaultRequestConfigManagerCustomizer;
|
||||||
|
|
||||||
private final Function<SslBundle, TlsSocketStrategy> tlsSocketStrategyFactory;
|
private final Function<SslBundle, TlsSocketStrategy> tlsSocketStrategyFactory;
|
||||||
|
|
||||||
HttpComponentsClientHttpRequestFactoryBuilder() {
|
HttpComponentsClientHttpRequestFactoryBuilder() {
|
||||||
this(Collections.emptyList(), emptyCustomizer(), emptyCustomizer(), emptyCustomizer(),
|
this(Collections.emptyList(), emptyCustomizer(), emptyCustomizer(), emptyCustomizer(), emptyCustomizer(),
|
||||||
HttpComponentsClientHttpRequestFactoryBuilder::createTlsSocketStrategy);
|
HttpComponentsClientHttpRequestFactoryBuilder::createTlsSocketStrategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static TlsSocketStrategy createTlsSocketStrategy(SslBundle sslBundle) {
|
||||||
|
SslOptions options = sslBundle.getOptions();
|
||||||
|
return new DefaultClientTlsStrategy(sslBundle.createSslContext(), options.getEnabledProtocols(),
|
||||||
|
options.getCiphers(), null, new DefaultHostnameVerifier());
|
||||||
|
}
|
||||||
|
|
||||||
private HttpComponentsClientHttpRequestFactoryBuilder(
|
private HttpComponentsClientHttpRequestFactoryBuilder(
|
||||||
List<Consumer<HttpComponentsClientHttpRequestFactory>> customizers,
|
List<Consumer<HttpComponentsClientHttpRequestFactory>> customizers,
|
||||||
Consumer<HttpClientBuilder> httpClientCustomizer,
|
Consumer<HttpClientBuilder> httpClientCustomizer,
|
||||||
Consumer<PoolingHttpClientConnectionManagerBuilder> connectionManagerCustomizer,
|
Consumer<PoolingHttpClientConnectionManagerBuilder> connectionManagerCustomizer,
|
||||||
Consumer<SocketConfig.Builder> socketConfigCustomizer,
|
Consumer<SocketConfig.Builder> socketConfigCustomizer,
|
||||||
|
Consumer<RequestConfig.Builder> defaultRequestConfigManagerCustomizer,
|
||||||
Function<SslBundle, TlsSocketStrategy> tlsSocketStrategyFactory) {
|
Function<SslBundle, TlsSocketStrategy> tlsSocketStrategyFactory) {
|
||||||
super(customizers);
|
super(customizers);
|
||||||
this.httpClientCustomizer = httpClientCustomizer;
|
this.httpClientCustomizer = httpClientCustomizer;
|
||||||
this.connectionManagerCustomizer = connectionManagerCustomizer;
|
this.connectionManagerCustomizer = connectionManagerCustomizer;
|
||||||
this.socketConfigCustomizer = socketConfigCustomizer;
|
this.socketConfigCustomizer = socketConfigCustomizer;
|
||||||
|
this.defaultRequestConfigManagerCustomizer = defaultRequestConfigManagerCustomizer;
|
||||||
this.tlsSocketStrategyFactory = tlsSocketStrategyFactory;
|
this.tlsSocketStrategyFactory = tlsSocketStrategyFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +100,7 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
|
||||||
Consumer<HttpComponentsClientHttpRequestFactory> customizer) {
|
Consumer<HttpComponentsClientHttpRequestFactory> customizer) {
|
||||||
return new HttpComponentsClientHttpRequestFactoryBuilder(mergedCustomizers(customizer),
|
return new HttpComponentsClientHttpRequestFactoryBuilder(mergedCustomizers(customizer),
|
||||||
this.httpClientCustomizer, this.connectionManagerCustomizer, this.socketConfigCustomizer,
|
this.httpClientCustomizer, this.connectionManagerCustomizer, this.socketConfigCustomizer,
|
||||||
this.tlsSocketStrategyFactory);
|
this.defaultRequestConfigManagerCustomizer, this.tlsSocketStrategyFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -97,7 +108,7 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
|
||||||
Collection<Consumer<HttpComponentsClientHttpRequestFactory>> customizers) {
|
Collection<Consumer<HttpComponentsClientHttpRequestFactory>> customizers) {
|
||||||
return new HttpComponentsClientHttpRequestFactoryBuilder(mergedCustomizers(customizers),
|
return new HttpComponentsClientHttpRequestFactoryBuilder(mergedCustomizers(customizers),
|
||||||
this.httpClientCustomizer, this.connectionManagerCustomizer, this.socketConfigCustomizer,
|
this.httpClientCustomizer, this.connectionManagerCustomizer, this.socketConfigCustomizer,
|
||||||
this.tlsSocketStrategyFactory);
|
this.defaultRequestConfigManagerCustomizer, this.tlsSocketStrategyFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -111,7 +122,7 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
|
||||||
Assert.notNull(httpClientCustomizer, "'httpClientCustomizer' must not be null");
|
Assert.notNull(httpClientCustomizer, "'httpClientCustomizer' must not be null");
|
||||||
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(),
|
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(),
|
||||||
this.httpClientCustomizer.andThen(httpClientCustomizer), this.connectionManagerCustomizer,
|
this.httpClientCustomizer.andThen(httpClientCustomizer), this.connectionManagerCustomizer,
|
||||||
this.socketConfigCustomizer, this.tlsSocketStrategyFactory);
|
this.socketConfigCustomizer, this.defaultRequestConfigManagerCustomizer, this.tlsSocketStrategyFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -126,7 +137,7 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
|
||||||
Assert.notNull(connectionManagerCustomizer, "'connectionManagerCustomizer' must not be null");
|
Assert.notNull(connectionManagerCustomizer, "'connectionManagerCustomizer' must not be null");
|
||||||
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
|
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
|
||||||
this.connectionManagerCustomizer.andThen(connectionManagerCustomizer), this.socketConfigCustomizer,
|
this.connectionManagerCustomizer.andThen(connectionManagerCustomizer), this.socketConfigCustomizer,
|
||||||
this.tlsSocketStrategyFactory);
|
this.defaultRequestConfigManagerCustomizer, this.tlsSocketStrategyFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -141,7 +152,7 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
|
||||||
Assert.notNull(socketConfigCustomizer, "'socketConfigCustomizer' must not be null");
|
Assert.notNull(socketConfigCustomizer, "'socketConfigCustomizer' must not be null");
|
||||||
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
|
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
|
||||||
this.connectionManagerCustomizer, this.socketConfigCustomizer.andThen(socketConfigCustomizer),
|
this.connectionManagerCustomizer, this.socketConfigCustomizer.andThen(socketConfigCustomizer),
|
||||||
this.tlsSocketStrategyFactory);
|
this.defaultRequestConfigManagerCustomizer, this.tlsSocketStrategyFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -155,7 +166,25 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
|
||||||
Function<SslBundle, TlsSocketStrategy> tlsSocketStrategyFactory) {
|
Function<SslBundle, TlsSocketStrategy> tlsSocketStrategyFactory) {
|
||||||
Assert.notNull(tlsSocketStrategyFactory, "'tlsSocketStrategyFactory' must not be null");
|
Assert.notNull(tlsSocketStrategyFactory, "'tlsSocketStrategyFactory' must not be null");
|
||||||
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
|
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
|
||||||
this.connectionManagerCustomizer, this.socketConfigCustomizer, tlsSocketStrategyFactory);
|
this.connectionManagerCustomizer, this.socketConfigCustomizer,
|
||||||
|
this.defaultRequestConfigManagerCustomizer, tlsSocketStrategyFactory);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a new {@link HttpComponentsClientHttpRequestFactoryBuilder} that applies
|
||||||
|
* additional customization to the underlying
|
||||||
|
* {@link org.apache.hc.client5.http.config.RequestConfig.Builder} used for default
|
||||||
|
* requests.
|
||||||
|
* @param defaultRequestConfigManagerCustomizer the customizer to apply
|
||||||
|
* @return a new {@link HttpComponentsClientHttpRequestFactoryBuilder} instance
|
||||||
|
*/
|
||||||
|
public HttpComponentsClientHttpRequestFactoryBuilder withDefaultRequestConfigManagerCustomizer(
|
||||||
|
Consumer<RequestConfig.Builder> defaultRequestConfigManagerCustomizer) {
|
||||||
|
Assert.notNull(defaultRequestConfigManagerCustomizer,
|
||||||
|
"'defaultRequestConfigManagerCustomizer' must not be null");
|
||||||
|
return new HttpComponentsClientHttpRequestFactoryBuilder(getCustomizers(), this.httpClientCustomizer,
|
||||||
|
this.connectionManagerCustomizer, this.socketConfigCustomizer, defaultRequestConfigManagerCustomizer,
|
||||||
|
this.tlsSocketStrategyFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -172,7 +201,8 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
|
||||||
HttpClientBuilder builder = HttpClientBuilder.create()
|
HttpClientBuilder builder = HttpClientBuilder.create()
|
||||||
.useSystemProperties()
|
.useSystemProperties()
|
||||||
.setRedirectStrategy(asRedirectStrategy(settings.redirects()))
|
.setRedirectStrategy(asRedirectStrategy(settings.redirects()))
|
||||||
.setConnectionManager(createConnectionManager(settings));
|
.setConnectionManager(createConnectionManager(settings))
|
||||||
|
.setDefaultRequestConfig(createDefaultRequestConfig());
|
||||||
this.httpClientCustomizer.accept(builder);
|
this.httpClientCustomizer.accept(builder);
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
@ -204,10 +234,10 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TlsSocketStrategy createTlsSocketStrategy(SslBundle sslBundle) {
|
private RequestConfig createDefaultRequestConfig() {
|
||||||
SslOptions options = sslBundle.getOptions();
|
RequestConfig.Builder builder = RequestConfig.custom();
|
||||||
return new DefaultClientTlsStrategy(sslBundle.createSslContext(), options.getEnabledProtocols(),
|
this.defaultRequestConfigManagerCustomizer.accept(builder);
|
||||||
options.getCiphers(), null, new DefaultHostnameVerifier());
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -22,12 +22,12 @@ import java.util.function.Function;
|
||||||
|
|
||||||
import org.apache.hc.client5.http.HttpRoute;
|
import org.apache.hc.client5.http.HttpRoute;
|
||||||
import org.apache.hc.client5.http.classic.HttpClient;
|
import org.apache.hc.client5.http.classic.HttpClient;
|
||||||
|
import org.apache.hc.client5.http.config.RequestConfig;
|
||||||
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
|
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
|
||||||
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
|
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
|
||||||
import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
|
import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
|
||||||
import org.apache.hc.core5.function.Resolver;
|
import org.apache.hc.core5.function.Resolver;
|
||||||
import org.apache.hc.core5.http.io.SocketConfig;
|
import org.apache.hc.core5.http.io.SocketConfig;
|
||||||
import org.apache.hc.core5.http.io.SocketConfig.Builder;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import org.springframework.boot.ssl.SslBundle;
|
import org.springframework.boot.ssl.SslBundle;
|
||||||
|
@ -54,17 +54,20 @@ class HttpComponentsClientHttpRequestFactoryBuilderTests
|
||||||
TestCustomizer<HttpClientBuilder> httpClientCustomizer1 = new TestCustomizer<>();
|
TestCustomizer<HttpClientBuilder> httpClientCustomizer1 = new TestCustomizer<>();
|
||||||
TestCustomizer<HttpClientBuilder> httpClientCustomizer2 = new TestCustomizer<>();
|
TestCustomizer<HttpClientBuilder> httpClientCustomizer2 = new TestCustomizer<>();
|
||||||
TestCustomizer<PoolingHttpClientConnectionManagerBuilder> connectionManagerCustomizer = new TestCustomizer<>();
|
TestCustomizer<PoolingHttpClientConnectionManagerBuilder> connectionManagerCustomizer = new TestCustomizer<>();
|
||||||
TestCustomizer<Builder> socketConfigCustomizer = new TestCustomizer<>();
|
TestCustomizer<SocketConfig.Builder> socketConfigCustomizer = new TestCustomizer<>();
|
||||||
|
TestCustomizer<RequestConfig.Builder> defaultRequestConfigManagerCustomizer = new TestCustomizer<>();
|
||||||
ClientHttpRequestFactoryBuilder.httpComponents()
|
ClientHttpRequestFactoryBuilder.httpComponents()
|
||||||
.withHttpClientCustomizer(httpClientCustomizer1)
|
.withHttpClientCustomizer(httpClientCustomizer1)
|
||||||
.withHttpClientCustomizer(httpClientCustomizer2)
|
.withHttpClientCustomizer(httpClientCustomizer2)
|
||||||
.withConnectionManagerCustomizer(connectionManagerCustomizer)
|
.withConnectionManagerCustomizer(connectionManagerCustomizer)
|
||||||
.withSocketConfigCustomizer(socketConfigCustomizer)
|
.withSocketConfigCustomizer(socketConfigCustomizer)
|
||||||
|
.withDefaultRequestConfigManagerCustomizer(defaultRequestConfigManagerCustomizer)
|
||||||
.build();
|
.build();
|
||||||
httpClientCustomizer1.assertCalled();
|
httpClientCustomizer1.assertCalled();
|
||||||
httpClientCustomizer2.assertCalled();
|
httpClientCustomizer2.assertCalled();
|
||||||
connectionManagerCustomizer.assertCalled();
|
connectionManagerCustomizer.assertCalled();
|
||||||
socketConfigCustomizer.assertCalled();
|
socketConfigCustomizer.assertCalled();
|
||||||
|
defaultRequestConfigManagerCustomizer.assertCalled();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue