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 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       * Assigns {@link HttpProcessor} instance.
91       */
92      public final RequesterBootstrap setHttpProcessor(final HttpProcessor httpProcessor) {
93          this.httpProcessor = httpProcessor;
94          return this;
95      }
96  
97      /**
98       * Assigns {@link ConnectionReuseStrategy} instance.
99       */
100     public final RequesterBootstrap setConnectionReuseStrategy(final ConnectionReuseStrategy connStrategy) {
101         this.connReuseStrategy = connStrategy;
102         return this;
103     }
104 
105     /**
106      * Sets socket configuration.
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      * Assigns {@link Callback} for {@link SSLParameters}.
130      */
131     public final RequesterBootstrap setSslSetupHandler(final Callback<SSLParameters> sslSetupHandler) {
132         this.sslSetupHandler = sslSetupHandler;
133         return this;
134     }
135 
136     /**
137      * Assigns {@link SSLSessionVerifier} instance.
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 }