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 Http1Config http1Config;
69 private ConnectionReuseStrategy connReuseStrategy;
70 private SocketConfig socketConfig;
71 private HttpConnectionFactory<? extends HttpClientConnection> connectFactory;
72 private SSLSocketFactory sslSocketFactory;
73 private Callback<SSLParameters> sslSetupHandler;
74 private SSLSessionVerifier sslSessionVerifier;
75 private int defaultMaxPerRoute;
76 private int maxTotal;
77 private Timeout timeToLive;
78 private PoolReusePolicy poolReusePolicy;
79 private PoolConcurrencyPolicy poolConcurrencyPolicy;
80 private Http1StreamListener streamListener;
81 private ConnPoolListener<HttpHost> connPoolListener;
82
83 private RequesterBootstrap() {
84 }
85
86 public static RequesterBootstrap bootstrap() {
87 return new RequesterBootstrap();
88 }
89
90
91
92
93 public final RequesterBootstrap setHttpProcessor(final HttpProcessor httpProcessor) {
94 this.httpProcessor = httpProcessor;
95 return this;
96 }
97
98
99
100
101 public final RequesterBootstrap setHttp1Config(final Http1Config http1Config) {
102 this.http1Config = http1Config;
103 return this;
104 }
105
106
107
108
109 public final RequesterBootstrap setConnectionReuseStrategy(final ConnectionReuseStrategy connStrategy) {
110 this.connReuseStrategy = connStrategy;
111 return this;
112 }
113
114
115
116
117 public final RequesterBootstrap setSocketConfig(final SocketConfig socketConfig) {
118 this.socketConfig = socketConfig;
119 return this;
120 }
121
122 public final RequesterBootstrap setConnectionFactory(final HttpConnectionFactory<? extends HttpClientConnection> connectFactory) {
123 this.connectFactory = connectFactory;
124 return this;
125 }
126
127 public final RequesterBootstrap setSslContext(final SSLContext sslContext) {
128 this.sslSocketFactory = sslContext != null ? sslContext.getSocketFactory() : null;
129 return this;
130 }
131
132 public final RequesterBootstrap setSslSocketFactory(final SSLSocketFactory sslSocketFactory) {
133 this.sslSocketFactory = sslSocketFactory;
134 return this;
135 }
136
137
138
139
140 public final RequesterBootstrap setSslSetupHandler(final Callback<SSLParameters> sslSetupHandler) {
141 this.sslSetupHandler = sslSetupHandler;
142 return this;
143 }
144
145
146
147
148 public final RequesterBootstrap setSslSessionVerifier(final SSLSessionVerifier sslSessionVerifier) {
149 this.sslSessionVerifier = sslSessionVerifier;
150 return this;
151 }
152
153 public final RequesterBootstrap setDefaultMaxPerRoute(final int defaultMaxPerRoute) {
154 this.defaultMaxPerRoute = defaultMaxPerRoute;
155 return this;
156 }
157
158 public final RequesterBootstrap setMaxTotal(final int maxTotal) {
159 this.maxTotal = maxTotal;
160 return this;
161 }
162
163 public final RequesterBootstrap setTimeToLive(final Timeout timeToLive) {
164 this.timeToLive = timeToLive;
165 return this;
166 }
167
168 public final RequesterBootstrap setPoolReusePolicy(final PoolReusePolicy poolReusePolicy) {
169 this.poolReusePolicy = poolReusePolicy;
170 return this;
171 }
172
173 @Experimental
174 public final RequesterBootstrap setPoolConcurrencyPolicy(final PoolConcurrencyPolicy poolConcurrencyPolicy) {
175 this.poolConcurrencyPolicy = poolConcurrencyPolicy;
176 return this;
177 }
178
179 public final RequesterBootstrap setStreamListener(final Http1StreamListener streamListener) {
180 this.streamListener = streamListener;
181 return this;
182 }
183
184 public final RequesterBootstrap setConnPoolListener(final ConnPoolListener<HttpHost> connPoolListener) {
185 this.connPoolListener = connPoolListener;
186 return this;
187 }
188
189 public HttpRequester create() {
190 final HttpRequestExecutor requestExecutor = new HttpRequestExecutor(
191 http1Config,
192 connReuseStrategy != null ? connReuseStrategy : DefaultConnectionReuseStrategy.INSTANCE,
193 streamListener);
194 final ManagedConnPool<HttpHost, HttpClientConnection> connPool;
195 switch (poolConcurrencyPolicy != null ? poolConcurrencyPolicy : PoolConcurrencyPolicy.STRICT) {
196 case LAX:
197 connPool = new LaxConnPool<>(
198 defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
199 timeToLive,
200 poolReusePolicy,
201 new DefaultDisposalCallback<>(),
202 connPoolListener);
203 break;
204 case STRICT:
205 default:
206 connPool = new StrictConnPool<>(
207 defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
208 maxTotal > 0 ? maxTotal : 50,
209 timeToLive,
210 poolReusePolicy,
211 new DefaultDisposalCallback<>(),
212 connPoolListener);
213 break;
214 }
215 return new HttpRequester(
216 requestExecutor,
217 httpProcessor != null ? httpProcessor : HttpProcessors.client(),
218 connPool,
219 socketConfig != null ? socketConfig : SocketConfig.DEFAULT,
220 connectFactory != null ? connectFactory : new DefaultBHttpClientConnectionFactory(
221 http1Config, CharCodingConfig.DEFAULT),
222 sslSocketFactory,
223 sslSetupHandler != null ? sslSetupHandler : new DefaultTlsSetupHandler(),
224 sslSessionVerifier,
225 DefaultAddressResolver.INSTANCE);
226 }
227
228 }