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