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 package org.apache.hc.core5.http.impl.bootstrap;
28
29 import javax.net.ssl.SSLContext;
30 import javax.net.ssl.SSLParameters;
31 import javax.net.ssl.SSLSocketFactory;
32
33 import org.apache.hc.core5.annotation.Experimental;
34 import org.apache.hc.core5.function.Callback;
35 import org.apache.hc.core5.http.ConnectionReuseStrategy;
36 import org.apache.hc.core5.http.HttpHost;
37 import org.apache.hc.core5.http.config.CharCodingConfig;
38 import org.apache.hc.core5.http.config.Http1Config;
39 import org.apache.hc.core5.http.impl.DefaultAddressResolver;
40 import org.apache.hc.core5.http.impl.DefaultConnectionReuseStrategy;
41 import org.apache.hc.core5.http.impl.Http1StreamListener;
42 import org.apache.hc.core5.http.impl.HttpProcessors;
43 import org.apache.hc.core5.http.impl.io.DefaultBHttpClientConnectionFactory;
44 import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
45 import org.apache.hc.core5.http.io.HttpClientConnection;
46 import org.apache.hc.core5.http.io.HttpConnectionFactory;
47 import org.apache.hc.core5.http.io.SocketConfig;
48 import org.apache.hc.core5.http.io.ssl.DefaultTlsSetupHandler;
49 import org.apache.hc.core5.http.io.ssl.SSLSessionVerifier;
50 import org.apache.hc.core5.http.protocol.HttpProcessor;
51 import org.apache.hc.core5.pool.ConnPoolListener;
52 import org.apache.hc.core5.pool.DefaultDisposalCallback;
53 import org.apache.hc.core5.pool.LaxConnPool;
54 import org.apache.hc.core5.pool.ManagedConnPool;
55 import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
56 import org.apache.hc.core5.pool.PoolReusePolicy;
57 import org.apache.hc.core5.pool.StrictConnPool;
58 import org.apache.hc.core5.util.Timeout;
59
60
61
62
63
64
65 public class RequesterBootstrap {
66
67 private HttpProcessor httpProcessor;
68 private ConnectionReuseStrategy connReuseStrategy;
69 private SocketConfig socketConfig;
70 private HttpConnectionFactory<? extends HttpClientConnection> connectFactory;
71 private SSLSocketFactory sslSocketFactory;
72 private Callback<SSLParameters> sslSetupHandler;
73 private SSLSessionVerifier sslSessionVerifier;
74 private int defaultMaxPerRoute;
75 private int maxTotal;
76 private Timeout timeToLive;
77 private PoolReusePolicy poolReusePolicy;
78 private PoolConcurrencyPolicy poolConcurrencyPolicy;
79 private Http1StreamListener streamListener;
80 private ConnPoolListener<HttpHost> connPoolListener;
81
82 private RequesterBootstrap() {
83 }
84
85 public static RequesterBootstrap bootstrap() {
86 return new RequesterBootstrap();
87 }
88
89
90
91
92 public final RequesterBootstrap setHttpProcessor(final HttpProcessor httpProcessor) {
93 this.httpProcessor = httpProcessor;
94 return this;
95 }
96
97
98
99
100 public final RequesterBootstrap setConnectionReuseStrategy(final ConnectionReuseStrategy connStrategy) {
101 this.connReuseStrategy = connStrategy;
102 return this;
103 }
104
105
106
107
108 public final RequesterBootstrap setSocketConfig(final SocketConfig socketConfig) {
109 this.socketConfig = socketConfig;
110 return this;
111 }
112
113 public final RequesterBootstrap setConnectionFactory(final HttpConnectionFactory<? extends HttpClientConnection> connectFactory) {
114 this.connectFactory = connectFactory;
115 return this;
116 }
117
118 public final RequesterBootstrap setSslContext(final SSLContext sslContext) {
119 this.sslSocketFactory = sslContext != null ? sslContext.getSocketFactory() : null;
120 return this;
121 }
122
123 public final RequesterBootstrap setSslSocketFactory(final SSLSocketFactory sslSocketFactory) {
124 this.sslSocketFactory = sslSocketFactory;
125 return this;
126 }
127
128
129
130
131 public final RequesterBootstrap setSslSetupHandler(final Callback<SSLParameters> sslSetupHandler) {
132 this.sslSetupHandler = sslSetupHandler;
133 return this;
134 }
135
136
137
138
139 public final RequesterBootstrap setSslSessionVerifier(final SSLSessionVerifier sslSessionVerifier) {
140 this.sslSessionVerifier = sslSessionVerifier;
141 return this;
142 }
143
144 public final RequesterBootstrap setDefaultMaxPerRoute(final int defaultMaxPerRoute) {
145 this.defaultMaxPerRoute = defaultMaxPerRoute;
146 return this;
147 }
148
149 public final RequesterBootstrap setMaxTotal(final int maxTotal) {
150 this.maxTotal = maxTotal;
151 return this;
152 }
153
154 public final RequesterBootstrap setTimeToLive(final Timeout timeToLive) {
155 this.timeToLive = timeToLive;
156 return this;
157 }
158
159 public final RequesterBootstrap setPoolReusePolicy(final PoolReusePolicy poolReusePolicy) {
160 this.poolReusePolicy = poolReusePolicy;
161 return this;
162 }
163
164 @Experimental
165 public final RequesterBootstrap setPoolConcurrencyPolicy(final PoolConcurrencyPolicy poolConcurrencyPolicy) {
166 this.poolConcurrencyPolicy = poolConcurrencyPolicy;
167 return this;
168 }
169
170 public final RequesterBootstrap setStreamListener(final Http1StreamListener streamListener) {
171 this.streamListener = streamListener;
172 return this;
173 }
174
175 public final RequesterBootstrap setConnPoolListener(final ConnPoolListener<HttpHost> connPoolListener) {
176 this.connPoolListener = connPoolListener;
177 return this;
178 }
179
180 public HttpRequester create() {
181 final HttpRequestExecutorestExecutor.html#HttpRequestExecutor">HttpRequestExecutor requestExecutor = new HttpRequestExecutor(
182 HttpRequestExecutor.DEFAULT_WAIT_FOR_CONTINUE,
183 connReuseStrategy != null ? connReuseStrategy : DefaultConnectionReuseStrategy.INSTANCE,
184 streamListener);
185 final ManagedConnPool<HttpHost, HttpClientConnection> connPool;
186 switch (poolConcurrencyPolicy != null ? poolConcurrencyPolicy : PoolConcurrencyPolicy.STRICT) {
187 case LAX:
188 connPool = new LaxConnPool<>(
189 defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
190 timeToLive,
191 poolReusePolicy,
192 new DefaultDisposalCallback<HttpClientConnection>(),
193 connPoolListener);
194 break;
195 case STRICT:
196 default:
197 connPool = new StrictConnPool<>(
198 defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
199 maxTotal > 0 ? maxTotal : 50,
200 timeToLive,
201 poolReusePolicy,
202 new DefaultDisposalCallback<HttpClientConnection>(),
203 connPoolListener);
204 break;
205 }
206 return new HttpRequester(
207 requestExecutor,
208 httpProcessor != null ? httpProcessor : HttpProcessors.client(),
209 connPool,
210 socketConfig != null ? socketConfig : SocketConfig.DEFAULT,
211 connectFactory != null ? connectFactory : new DefaultBHttpClientConnectionFactory(
212 Http1Config.DEFAULT, CharCodingConfig.DEFAULT),
213 sslSocketFactory,
214 sslSetupHandler != null ? sslSetupHandler : new DefaultTlsSetupHandler(),
215 sslSessionVerifier,
216 DefaultAddressResolver.INSTANCE);
217 }
218
219 }