1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.client5.http.impl.io;
29
30 import javax.net.ssl.SSLSocket;
31
32 import org.apache.hc.client5.http.DnsResolver;
33 import org.apache.hc.client5.http.HttpRoute;
34 import org.apache.hc.client5.http.SchemePortResolver;
35 import org.apache.hc.client5.http.config.ConnectionConfig;
36 import org.apache.hc.client5.http.config.TlsConfig;
37 import org.apache.hc.client5.http.io.HttpClientConnectionOperator;
38 import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
39 import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
40 import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
41 import org.apache.hc.core5.annotation.Internal;
42 import org.apache.hc.core5.function.Resolver;
43 import org.apache.hc.core5.http.HttpHost;
44 import org.apache.hc.core5.http.URIScheme;
45 import org.apache.hc.core5.http.config.RegistryBuilder;
46 import org.apache.hc.core5.http.io.HttpConnectionFactory;
47 import org.apache.hc.core5.http.io.SocketConfig;
48 import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
49 import org.apache.hc.core5.pool.PoolReusePolicy;
50 import org.apache.hc.core5.util.TimeValue;
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 public class PoolingHttpClientConnectionManagerBuilder {
79
80 private HttpConnectionFactory<ManagedHttpClientConnection> connectionFactory;
81 private TlsSocketStrategy tlsSocketStrategy;
82 private SchemePortResolver schemePortResolver;
83 private DnsResolver dnsResolver;
84 private PoolConcurrencyPolicy poolConcurrencyPolicy;
85 private PoolReusePolicy poolReusePolicy;
86 private Resolver<HttpRoute, SocketConfig> socketConfigResolver;
87 private Resolver<HttpRoute, ConnectionConfig> connectionConfigResolver;
88 private Resolver<HttpHost, TlsConfig> tlsConfigResolver;
89
90 private boolean systemProperties;
91
92 private int maxConnTotal;
93 private int maxConnPerRoute;
94
95 public static PoolingHttpClientConnectionManagerBuilder create() {
96 return new PoolingHttpClientConnectionManagerBuilder();
97 }
98
99 @Internal
100 protected PoolingHttpClientConnectionManagerBuilder() {
101 super();
102 }
103
104
105
106
107
108
109 public final PoolingHttpClientConnectionManagerBuilder setConnectionFactory(
110 final HttpConnectionFactory<ManagedHttpClientConnection> connectionFactory) {
111 this.connectionFactory = connectionFactory;
112 return this;
113 }
114
115
116
117
118
119
120
121 @Deprecated
122 public final PoolingHttpClientConnectionManagerBuilder setSSLSocketFactory(
123 final org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory sslSocketFactory) {
124 this.tlsSocketStrategy = (socket, target, port, attachment, context) ->
125 (SSLSocket) sslSocketFactory.createLayeredSocket(socket, target, port, context);
126 return this;
127 }
128
129
130
131
132
133
134 public final PoolingHttpClientConnectionManagerBuilder setTlsSocketStrategy(final TlsSocketStrategy tlsSocketStrategy) {
135 this.tlsSocketStrategy = tlsSocketStrategy;
136 return this;
137 }
138
139
140
141
142
143
144 public final PoolingHttpClientConnectionManagerBuilder setDnsResolver(final DnsResolver dnsResolver) {
145 this.dnsResolver = dnsResolver;
146 return this;
147 }
148
149
150
151
152
153
154 public final PoolingHttpClientConnectionManagerBuilder setSchemePortResolver(final SchemePortResolver schemePortResolver) {
155 this.schemePortResolver = schemePortResolver;
156 return this;
157 }
158
159
160
161
162
163
164 public final PoolingHttpClientConnectionManagerBuilder setPoolConcurrencyPolicy(final PoolConcurrencyPolicy poolConcurrencyPolicy) {
165 this.poolConcurrencyPolicy = poolConcurrencyPolicy;
166 return this;
167 }
168
169
170
171
172
173
174 public final PoolingHttpClientConnectionManagerBuilder setConnPoolPolicy(final PoolReusePolicy poolReusePolicy) {
175 this.poolReusePolicy = poolReusePolicy;
176 return this;
177 }
178
179
180
181
182
183
184 public final PoolingHttpClientConnectionManagerBuilder setMaxConnTotal(final int maxConnTotal) {
185 this.maxConnTotal = maxConnTotal;
186 return this;
187 }
188
189
190
191
192
193
194 public final PoolingHttpClientConnectionManagerBuilder setMaxConnPerRoute(final int maxConnPerRoute) {
195 this.maxConnPerRoute = maxConnPerRoute;
196 return this;
197 }
198
199
200
201
202
203
204 public final PoolingHttpClientConnectionManagerBuilder setDefaultSocketConfig(final SocketConfig config) {
205 this.socketConfigResolver = route -> config;
206 return this;
207 }
208
209
210
211
212
213
214
215 public final PoolingHttpClientConnectionManagerBuilder setSocketConfigResolver(
216 final Resolver<HttpRoute, SocketConfig> socketConfigResolver) {
217 this.socketConfigResolver = socketConfigResolver;
218 return this;
219 }
220
221
222
223
224
225
226
227 public final PoolingHttpClientConnectionManagerBuilder setDefaultConnectionConfig(final ConnectionConfig config) {
228 this.connectionConfigResolver = route -> config;
229 return this;
230 }
231
232
233
234
235
236
237
238 public final PoolingHttpClientConnectionManagerBuilder setConnectionConfigResolver(
239 final Resolver<HttpRoute, ConnectionConfig> connectionConfigResolver) {
240 this.connectionConfigResolver = connectionConfigResolver;
241 return this;
242 }
243
244
245
246
247
248
249
250 public final PoolingHttpClientConnectionManagerBuilder setDefaultTlsConfig(final TlsConfig config) {
251 this.tlsConfigResolver = host -> config;
252 return this;
253 }
254
255
256
257
258
259
260
261 public final PoolingHttpClientConnectionManagerBuilder setTlsConfigResolver(
262 final Resolver<HttpHost, TlsConfig> tlsConfigResolver) {
263 this.tlsConfigResolver = tlsConfigResolver;
264 return this;
265 }
266
267
268
269
270
271
272
273 @Deprecated
274 public final PoolingHttpClientConnectionManagerBuilder setConnectionTimeToLive(final TimeValue timeToLive) {
275 setDefaultConnectionConfig(ConnectionConfig.custom()
276 .setTimeToLive(timeToLive)
277 .build());
278 return this;
279 }
280
281
282
283
284
285
286
287
288 @Deprecated
289 public final PoolingHttpClientConnectionManagerBuilder setValidateAfterInactivity(final TimeValue validateAfterInactivity) {
290 setDefaultConnectionConfig(ConnectionConfig.custom()
291 .setValidateAfterInactivity(validateAfterInactivity)
292 .build());
293 return this;
294 }
295
296
297
298
299
300
301
302 public final PoolingHttpClientConnectionManagerBuilder useSystemProperties() {
303 this.systemProperties = true;
304 return this;
305 }
306
307 @Internal
308 protected HttpClientConnectionOperator createConnectionOperator(
309 final SchemePortResolver schemePortResolver,
310 final DnsResolver dnsResolver,
311 final TlsSocketStrategy tlsSocketStrategy) {
312 return new DefaultHttpClientConnectionOperator(schemePortResolver, dnsResolver,
313 RegistryBuilder.<TlsSocketStrategy>create()
314 .register(URIScheme.HTTPS.id, tlsSocketStrategy)
315 .build());
316 }
317
318 public PoolingHttpClientConnectionManager build() {
319 final TlsSocketStrategy tlsSocketStrategyCopy;
320 if (tlsSocketStrategy != null) {
321 tlsSocketStrategyCopy = tlsSocketStrategy;
322 } else {
323 if (systemProperties) {
324 tlsSocketStrategyCopy = DefaultClientTlsStrategy.createSystemDefault();
325 } else {
326 tlsSocketStrategyCopy = DefaultClientTlsStrategy.createDefault();
327 }
328 }
329
330 final PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager(
331 createConnectionOperator(schemePortResolver, dnsResolver, tlsSocketStrategyCopy),
332 poolConcurrencyPolicy,
333 poolReusePolicy,
334 null,
335 connectionFactory);
336 poolingmgr.setSocketConfigResolver(socketConfigResolver);
337 poolingmgr.setConnectionConfigResolver(connectionConfigResolver);
338 poolingmgr.setTlsConfigResolver(tlsConfigResolver);
339 if (maxConnTotal > 0) {
340 poolingmgr.setMaxTotal(maxConnTotal);
341 }
342 if (maxConnPerRoute > 0) {
343 poolingmgr.setDefaultMaxPerRoute(maxConnPerRoute);
344 }
345 return poolingmgr;
346 }
347
348 }