View Javadoc
1   /*
2    * ====================================================================
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   * ====================================================================
20   *
21   * This software consists of voluntary contributions made by many
22   * individuals on behalf of the Apache Software Foundation.  For more
23   * information on the Apache Software Foundation, please see
24   * <http://www.apache.org/>.
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   * {@link HttpRequester} bootstrap.
62   *
63   * @since 5.0
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       * Assigns {@link HttpProcessor} instance.
92       */
93      public final RequesterBootstrap setHttpProcessor(final HttpProcessor httpProcessor) {
94          this.httpProcessor = httpProcessor;
95          return this;
96      }
97  
98      /**
99       * Sets HTTP/1 protocol configuration.
100      */
101     public final RequesterBootstrap setHttp1Config(final Http1Config http1Config) {
102         this.http1Config = http1Config;
103         return this;
104     }
105 
106     /**
107      * Assigns {@link ConnectionReuseStrategy} instance.
108      */
109     public final RequesterBootstrap setConnectionReuseStrategy(final ConnectionReuseStrategy connStrategy) {
110         this.connReuseStrategy = connStrategy;
111         return this;
112     }
113 
114     /**
115      * Sets socket configuration.
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      * Assigns {@link Callback} for {@link SSLParameters}.
139      */
140     public final RequesterBootstrap setSslSetupHandler(final Callback<SSLParameters> sslSetupHandler) {
141         this.sslSetupHandler = sslSetupHandler;
142         return this;
143     }
144 
145     /**
146      * Assigns {@link SSLSessionVerifier} instance.
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 }