2626import java .util .function .Function ;
2727
2828import org .apache .hc .client5 .http .classic .HttpClient ;
29+ import org .apache .hc .client5 .http .config .ConnectionConfig ;
2930import org .apache .hc .client5 .http .config .RequestConfig ;
3031import org .apache .hc .client5 .http .impl .DefaultRedirectStrategy ;
3132import org .apache .hc .client5 .http .impl .classic .HttpClientBuilder ;
@@ -65,13 +66,15 @@ public final class HttpComponentsClientHttpRequestFactoryBuilder
6566
6667 private final Consumer <SocketConfig .Builder > socketConfigCustomizer ;
6768
69+ private final Consumer <ConnectionConfig .Builder > connectionConfigCustomizer ;
70+
6871 private final Consumer <RequestConfig .Builder > defaultRequestConfigCustomizer ;
6972
7073 private final Function <SslBundle , TlsSocketStrategy > tlsSocketStrategyFactory ;
7174
7275 HttpComponentsClientHttpRequestFactoryBuilder () {
7376 this (Collections .emptyList (), emptyCustomizer (), emptyCustomizer (), emptyCustomizer (), emptyCustomizer (),
74- HttpComponentsClientHttpRequestFactoryBuilder ::createTlsSocketStrategy );
77+ emptyCustomizer (), HttpComponentsClientHttpRequestFactoryBuilder ::createTlsSocketStrategy );
7578 }
7679
7780 private static TlsSocketStrategy createTlsSocketStrategy (SslBundle sslBundle ) {
@@ -85,12 +88,14 @@ private HttpComponentsClientHttpRequestFactoryBuilder(
8588 Consumer <HttpClientBuilder > httpClientCustomizer ,
8689 Consumer <PoolingHttpClientConnectionManagerBuilder > connectionManagerCustomizer ,
8790 Consumer <SocketConfig .Builder > socketConfigCustomizer ,
91+ Consumer <ConnectionConfig .Builder > connectionConfigCustomizer ,
8892 Consumer <RequestConfig .Builder > defaultRequestConfigCustomizer ,
8993 Function <SslBundle , TlsSocketStrategy > tlsSocketStrategyFactory ) {
9094 super (customizers );
9195 this .httpClientCustomizer = httpClientCustomizer ;
9296 this .connectionManagerCustomizer = connectionManagerCustomizer ;
9397 this .socketConfigCustomizer = socketConfigCustomizer ;
98+ this .connectionConfigCustomizer = connectionConfigCustomizer ;
9499 this .defaultRequestConfigCustomizer = defaultRequestConfigCustomizer ;
95100 this .tlsSocketStrategyFactory = tlsSocketStrategyFactory ;
96101 }
@@ -100,15 +105,15 @@ public HttpComponentsClientHttpRequestFactoryBuilder withCustomizer(
100105 Consumer <HttpComponentsClientHttpRequestFactory > customizer ) {
101106 return new HttpComponentsClientHttpRequestFactoryBuilder (mergedCustomizers (customizer ),
102107 this .httpClientCustomizer , this .connectionManagerCustomizer , this .socketConfigCustomizer ,
103- this .defaultRequestConfigCustomizer , this .tlsSocketStrategyFactory );
108+ this .connectionConfigCustomizer , this . defaultRequestConfigCustomizer , this .tlsSocketStrategyFactory );
104109 }
105110
106111 @ Override
107112 public HttpComponentsClientHttpRequestFactoryBuilder withCustomizers (
108113 Collection <Consumer <HttpComponentsClientHttpRequestFactory >> customizers ) {
109114 return new HttpComponentsClientHttpRequestFactoryBuilder (mergedCustomizers (customizers ),
110115 this .httpClientCustomizer , this .connectionManagerCustomizer , this .socketConfigCustomizer ,
111- this .defaultRequestConfigCustomizer , this .tlsSocketStrategyFactory );
116+ this .connectionConfigCustomizer , this . defaultRequestConfigCustomizer , this .tlsSocketStrategyFactory );
112117 }
113118
114119 /**
@@ -122,7 +127,8 @@ public HttpComponentsClientHttpRequestFactoryBuilder withHttpClientCustomizer(
122127 Assert .notNull (httpClientCustomizer , "'httpClientCustomizer' must not be null" );
123128 return new HttpComponentsClientHttpRequestFactoryBuilder (getCustomizers (),
124129 this .httpClientCustomizer .andThen (httpClientCustomizer ), this .connectionManagerCustomizer ,
125- this .socketConfigCustomizer , this .defaultRequestConfigCustomizer , this .tlsSocketStrategyFactory );
130+ this .socketConfigCustomizer , this .connectionConfigCustomizer , this .defaultRequestConfigCustomizer ,
131+ this .tlsSocketStrategyFactory );
126132 }
127133
128134 /**
@@ -137,7 +143,7 @@ public HttpComponentsClientHttpRequestFactoryBuilder withConnectionManagerCustom
137143 Assert .notNull (connectionManagerCustomizer , "'connectionManagerCustomizer' must not be null" );
138144 return new HttpComponentsClientHttpRequestFactoryBuilder (getCustomizers (), this .httpClientCustomizer ,
139145 this .connectionManagerCustomizer .andThen (connectionManagerCustomizer ), this .socketConfigCustomizer ,
140- this .defaultRequestConfigCustomizer , this .tlsSocketStrategyFactory );
146+ this .connectionConfigCustomizer , this . defaultRequestConfigCustomizer , this .tlsSocketStrategyFactory );
141147 }
142148
143149 /**
@@ -152,6 +158,23 @@ public HttpComponentsClientHttpRequestFactoryBuilder withSocketConfigCustomizer(
152158 Assert .notNull (socketConfigCustomizer , "'socketConfigCustomizer' must not be null" );
153159 return new HttpComponentsClientHttpRequestFactoryBuilder (getCustomizers (), this .httpClientCustomizer ,
154160 this .connectionManagerCustomizer , this .socketConfigCustomizer .andThen (socketConfigCustomizer ),
161+ this .connectionConfigCustomizer , this .defaultRequestConfigCustomizer , this .tlsSocketStrategyFactory );
162+ }
163+
164+ /**
165+ * Return a new {@link HttpComponentsClientHttpRequestFactoryBuilder} that applies
166+ * additional customization to the underlying
167+ * {@link org.apache.hc.client5.http.config.ConnectionConfig.Builder}.
168+ * @param connectionConfigCustomizer the customizer to apply
169+ * @return a new {@link HttpComponentsClientHttpRequestFactoryBuilder} instance
170+ * @since 3.4.12
171+ */
172+ public HttpComponentsClientHttpRequestFactoryBuilder withConnectionConfigCustomizer (
173+ Consumer <ConnectionConfig .Builder > connectionConfigCustomizer ) {
174+ Assert .notNull (connectionConfigCustomizer , "'connectionConfigCustomizer' must not be null" );
175+ return new HttpComponentsClientHttpRequestFactoryBuilder (getCustomizers (), this .httpClientCustomizer ,
176+ this .connectionManagerCustomizer , this .socketConfigCustomizer ,
177+ this .connectionConfigCustomizer .andThen (connectionConfigCustomizer ),
155178 this .defaultRequestConfigCustomizer , this .tlsSocketStrategyFactory );
156179 }
157180
@@ -166,8 +189,8 @@ public HttpComponentsClientHttpRequestFactoryBuilder withTlsSocketStrategyFactor
166189 Function <SslBundle , TlsSocketStrategy > tlsSocketStrategyFactory ) {
167190 Assert .notNull (tlsSocketStrategyFactory , "'tlsSocketStrategyFactory' must not be null" );
168191 return new HttpComponentsClientHttpRequestFactoryBuilder (getCustomizers (), this .httpClientCustomizer ,
169- this .connectionManagerCustomizer , this .socketConfigCustomizer , this .defaultRequestConfigCustomizer ,
170- tlsSocketStrategyFactory );
192+ this .connectionManagerCustomizer , this .socketConfigCustomizer , this .connectionConfigCustomizer ,
193+ this . defaultRequestConfigCustomizer , tlsSocketStrategyFactory );
171194 }
172195
173196 /**
@@ -182,7 +205,7 @@ public HttpComponentsClientHttpRequestFactoryBuilder withDefaultRequestConfigCus
182205 Consumer <RequestConfig .Builder > defaultRequestConfigCustomizer ) {
183206 Assert .notNull (defaultRequestConfigCustomizer , "'defaultRequestConfigCustomizer' must not be null" );
184207 return new HttpComponentsClientHttpRequestFactoryBuilder (getCustomizers (), this .httpClientCustomizer ,
185- this .connectionManagerCustomizer , this .socketConfigCustomizer ,
208+ this .connectionManagerCustomizer , this .socketConfigCustomizer , this . connectionConfigCustomizer ,
186209 this .defaultRequestConfigCustomizer .andThen (defaultRequestConfigCustomizer ),
187210 this .tlsSocketStrategyFactory );
188211 }
@@ -191,10 +214,7 @@ public HttpComponentsClientHttpRequestFactoryBuilder withDefaultRequestConfigCus
191214 protected HttpComponentsClientHttpRequestFactory createClientHttpRequestFactory (
192215 ClientHttpRequestFactorySettings settings ) {
193216 HttpClient httpClient = createHttpClient (settings );
194- HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory (httpClient );
195- PropertyMapper map = PropertyMapper .get ().alwaysApplyingWhenNonNull ();
196- map .from (settings ::connectTimeout ).asInt (Duration ::toMillis ).to (factory ::setConnectTimeout );
197- return factory ;
217+ return new HttpComponentsClientHttpRequestFactory (httpClient );
198218 }
199219
200220 private HttpClient createHttpClient (ClientHttpRequestFactorySettings settings ) {
@@ -218,19 +238,29 @@ private PoolingHttpClientConnectionManager createConnectionManager(ClientHttpReq
218238 PoolingHttpClientConnectionManagerBuilder builder = PoolingHttpClientConnectionManagerBuilder .create ()
219239 .useSystemProperties ();
220240 PropertyMapper map = PropertyMapper .get ().alwaysApplyingWhenNonNull ();
221- builder .setDefaultSocketConfig (createSocketConfig (settings ));
241+ builder .setDefaultSocketConfig (createSocketConfig ());
242+ builder .setDefaultConnectionConfig (createConnectionConfig (settings ));
222243 map .from (settings ::sslBundle ).as (this .tlsSocketStrategyFactory ).to (builder ::setTlsSocketStrategy );
223244 this .connectionManagerCustomizer .accept (builder );
224245 return builder .build ();
225246 }
226247
227- private SocketConfig createSocketConfig (ClientHttpRequestFactorySettings settings ) {
248+ private SocketConfig createSocketConfig () {
228249 SocketConfig .Builder builder = SocketConfig .custom ();
250+ this .socketConfigCustomizer .accept (builder );
251+ return builder .build ();
252+ }
253+
254+ private ConnectionConfig createConnectionConfig (ClientHttpRequestFactorySettings settings ) {
255+ ConnectionConfig .Builder builder = ConnectionConfig .custom ();
229256 PropertyMapper map = PropertyMapper .get ().alwaysApplyingWhenNonNull ();
257+ map .from (settings ::connectTimeout )
258+ .as (Duration ::toMillis )
259+ .to ((timeout ) -> builder .setConnectTimeout (timeout , TimeUnit .MILLISECONDS ));
230260 map .from (settings ::readTimeout )
231261 .asInt (Duration ::toMillis )
232- .to ((timeout ) -> builder .setSoTimeout (timeout , TimeUnit .MILLISECONDS ));
233- this .socketConfigCustomizer .accept (builder );
262+ .to ((timeout ) -> builder .setSocketTimeout (timeout , TimeUnit .MILLISECONDS ));
263+ this .connectionConfigCustomizer .accept (builder );
234264 return builder .build ();
235265 }
236266
0 commit comments