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.examples;
29
30 import java.net.InetAddress;
31 import java.net.UnknownHostException;
32 import java.nio.charset.CodingErrorAction;
33 import java.nio.charset.StandardCharsets;
34 import java.util.Arrays;
35 import java.util.Collections;
36
37 import javax.net.ssl.SSLContext;
38
39 import org.apache.hc.client5.http.ContextBuilder;
40 import org.apache.hc.client5.http.DnsResolver;
41 import org.apache.hc.client5.http.HttpRoute;
42 import org.apache.hc.client5.http.SystemDefaultDnsResolver;
43 import org.apache.hc.client5.http.auth.CredentialsProvider;
44 import org.apache.hc.client5.http.auth.StandardAuthScheme;
45 import org.apache.hc.client5.http.classic.methods.HttpGet;
46 import org.apache.hc.client5.http.config.ConnectionConfig;
47 import org.apache.hc.client5.http.config.RequestConfig;
48 import org.apache.hc.client5.http.config.TlsConfig;
49 import org.apache.hc.client5.http.cookie.BasicCookieStore;
50 import org.apache.hc.client5.http.cookie.CookieStore;
51 import org.apache.hc.client5.http.cookie.StandardCookieSpec;
52 import org.apache.hc.client5.http.impl.auth.CredentialsProviderBuilder;
53 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
54 import org.apache.hc.client5.http.impl.classic.HttpClients;
55 import org.apache.hc.client5.http.impl.io.ManagedHttpClientConnectionFactory;
56 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
57 import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
58 import org.apache.hc.client5.http.protocol.HttpClientContext;
59 import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
60 import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
61 import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
62 import org.apache.hc.core5.http.ClassicHttpRequest;
63 import org.apache.hc.core5.http.ClassicHttpResponse;
64 import org.apache.hc.core5.http.Header;
65 import org.apache.hc.core5.http.HttpHost;
66 import org.apache.hc.core5.http.ParseException;
67 import org.apache.hc.core5.http.config.CharCodingConfig;
68 import org.apache.hc.core5.http.config.Http1Config;
69 import org.apache.hc.core5.http.config.Registry;
70 import org.apache.hc.core5.http.config.RegistryBuilder;
71 import org.apache.hc.core5.http.impl.io.DefaultClassicHttpResponseFactory;
72 import org.apache.hc.core5.http.impl.io.DefaultHttpRequestWriterFactory;
73 import org.apache.hc.core5.http.impl.io.DefaultHttpResponseParser;
74 import org.apache.hc.core5.http.impl.io.DefaultHttpResponseParserFactory;
75 import org.apache.hc.core5.http.io.HttpConnectionFactory;
76 import org.apache.hc.core5.http.io.HttpMessageParser;
77 import org.apache.hc.core5.http.io.HttpMessageParserFactory;
78 import org.apache.hc.core5.http.io.HttpMessageWriterFactory;
79 import org.apache.hc.core5.http.io.SocketConfig;
80 import org.apache.hc.core5.http.io.entity.EntityUtils;
81 import org.apache.hc.core5.http.message.BasicHeader;
82 import org.apache.hc.core5.http.message.BasicLineParser;
83 import org.apache.hc.core5.http.message.LineParser;
84 import org.apache.hc.core5.http.message.StatusLine;
85 import org.apache.hc.core5.http.ssl.TLS;
86 import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
87 import org.apache.hc.core5.pool.PoolReusePolicy;
88 import org.apache.hc.core5.ssl.SSLContexts;
89 import org.apache.hc.core5.util.CharArrayBuffer;
90 import org.apache.hc.core5.util.TimeValue;
91 import org.apache.hc.core5.util.Timeout;
92
93
94
95
96
97 public class ClientConfiguration {
98
99 public final static void main(final String[] args) throws Exception {
100
101
102
103 final HttpMessageParserFactory<ClassicHttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() {
104
105 @Override
106 public HttpMessageParser<ClassicHttpResponse> create(final Http1Config h1Config) {
107 final LineParser lineParser = new BasicLineParser() {
108
109 @Override
110 public Header parseHeader(final CharArrayBuffer buffer) {
111 try {
112 return super.parseHeader(buffer);
113 } catch (final ParseException ex) {
114 return new BasicHeader(buffer.toString(), null);
115 }
116 }
117
118 };
119 return new DefaultHttpResponseParser(lineParser, DefaultClassicHttpResponseFactory.INSTANCE, h1Config);
120 }
121
122 };
123 final HttpMessageWriterFactory<ClassicHttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory();
124
125
126 final Http1Config h1Config = Http1Config.custom()
127 .setMaxHeaderCount(200)
128 .setMaxLineLength(2000)
129 .build();
130
131 final CharCodingConfig connectionConfig = CharCodingConfig.custom()
132 .setMalformedInputAction(CodingErrorAction.IGNORE)
133 .setUnmappableInputAction(CodingErrorAction.IGNORE)
134 .setCharset(StandardCharsets.UTF_8)
135 .build();
136
137
138
139
140
141 final HttpConnectionFactory<ManagedHttpClientConnection> connFactory = new ManagedHttpClientConnectionFactory(
142 h1Config, connectionConfig, requestWriterFactory, responseParserFactory);
143
144
145
146
147
148
149
150
151 final SSLContext sslcontext = SSLContexts.createSystemDefault();
152
153
154
155 final Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
156 .register("http", PlainConnectionSocketFactory.INSTANCE)
157 .register("https", new SSLConnectionSocketFactory(sslcontext))
158 .build();
159
160
161 final DnsResolver dnsResolver = new SystemDefaultDnsResolver() {
162
163 @Override
164 public InetAddress[] resolve(final String host) throws UnknownHostException {
165 if (host.equalsIgnoreCase("myhost")) {
166 return new InetAddress[] { InetAddress.getByAddress(new byte[] {127, 0, 0, 1}) };
167 } else {
168 return super.resolve(host);
169 }
170 }
171
172 };
173
174
175 final PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
176 socketFactoryRegistry, PoolConcurrencyPolicy.STRICT, PoolReusePolicy.LIFO, TimeValue.ofMinutes(5),
177 null, dnsResolver, null);
178
179
180
181 connManager.setDefaultSocketConfig(SocketConfig.custom()
182 .setTcpNoDelay(true)
183 .build());
184
185 connManager.setDefaultConnectionConfig(ConnectionConfig.custom()
186 .setConnectTimeout(Timeout.ofSeconds(30))
187 .setSocketTimeout(Timeout.ofSeconds(30))
188 .setValidateAfterInactivity(TimeValue.ofSeconds(10))
189 .setTimeToLive(TimeValue.ofHours(1))
190 .build());
191
192
193 connManager.setDefaultTlsConfig(TlsConfig.custom()
194 .setHandshakeTimeout(Timeout.ofSeconds(30))
195 .setSupportedProtocols(TLS.V_1_3)
196 .build());
197
198
199
200 connManager.setMaxTotal(100);
201 connManager.setDefaultMaxPerRoute(10);
202 connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 20);
203
204
205 final CookieStore cookieStore = new BasicCookieStore();
206
207 final CredentialsProvider credentialsProvider = CredentialsProviderBuilder.create()
208 .build();
209
210 final RequestConfig defaultRequestConfig = RequestConfig.custom()
211 .setCookieSpec(StandardCookieSpec.STRICT)
212 .setExpectContinueEnabled(true)
213 .setTargetPreferredAuthSchemes(Arrays.asList(StandardAuthScheme.NTLM, StandardAuthScheme.DIGEST))
214 .setProxyPreferredAuthSchemes(Collections.singletonList(StandardAuthScheme.BASIC))
215 .build();
216
217
218
219 try (final CloseableHttpClient httpclient = HttpClients.custom()
220 .setConnectionManager(connManager)
221 .setDefaultCookieStore(cookieStore)
222 .setDefaultCredentialsProvider(credentialsProvider)
223 .setProxy(new HttpHost("myproxy", 8080))
224 .setDefaultRequestConfig(defaultRequestConfig)
225 .build()) {
226 final HttpGet httpget = new HttpGet("http://httpbin.org/get");
227
228
229 final RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
230 .setConnectionRequestTimeout(Timeout.ofSeconds(5))
231 .build();
232 httpget.setConfig(requestConfig);
233
234
235
236
237 final HttpClientContext context = ContextBuilder.create()
238 .useCookieStore(cookieStore)
239 .useCredentialsProvider(credentialsProvider)
240 .build();
241
242 System.out.println("Executing request " + httpget.getMethod() + " " + httpget.getUri());
243 httpclient.execute(httpget, context, response -> {
244 System.out.println("----------------------------------------");
245 System.out.println(httpget + "->" + new StatusLine(response));
246 EntityUtils.consume(response.getEntity());
247 return null;
248 });
249
250 context.getRequest();
251
252 context.getHttpRoute();
253
254 context.getAuthExchanges();
255
256 context.getCookieOrigin();
257
258 context.getCookieSpec();
259
260 context.getUserToken();
261 }
262 }
263
264 }
265