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.client5.http.fluent;
28
29 import java.io.IOException;
30 import java.net.URISyntaxException;
31
32 import org.apache.hc.client5.http.auth.AuthCache;
33 import org.apache.hc.client5.http.auth.AuthScope;
34 import org.apache.hc.client5.http.auth.Credentials;
35 import org.apache.hc.client5.http.auth.CredentialsStore;
36 import org.apache.hc.client5.http.auth.NTCredentials;
37 import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
38 import org.apache.hc.client5.http.config.ConnectionConfig;
39 import org.apache.hc.client5.http.cookie.CookieStore;
40 import org.apache.hc.client5.http.impl.auth.BasicAuthCache;
41 import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
42 import org.apache.hc.client5.http.impl.auth.BasicScheme;
43 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
44 import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
45 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
46 import org.apache.hc.client5.http.protocol.HttpClientContext;
47 import org.apache.hc.core5.http.HttpHost;
48 import org.apache.hc.core5.util.TimeValue;
49
50
51
52
53
54
55
56
57
58 public class Executor {
59
60 final static CloseableHttpClient CLIENT;
61
62 static {
63 CLIENT = HttpClientBuilder.create()
64 .setConnectionManager(PoolingHttpClientConnectionManagerBuilder.create()
65 .useSystemProperties()
66 .setMaxConnPerRoute(100)
67 .setMaxConnTotal(200)
68 .setDefaultConnectionConfig(ConnectionConfig.custom()
69 .setValidateAfterInactivity(TimeValue.ofSeconds(10))
70 .build())
71 .build())
72 .useSystemProperties()
73 .evictExpiredConnections()
74 .evictIdleConnections(TimeValue.ofMinutes(1))
75 .build();
76 }
77
78 public static Executor newInstance() {
79 return new Executor(CLIENT);
80 }
81
82 public static Executor newInstance(final CloseableHttpClient httpclient) {
83 return new Executor(httpclient != null ? httpclient : CLIENT);
84 }
85
86 private final CloseableHttpClient httpclient;
87 private final AuthCache authCache;
88 private volatile CredentialsStore credentialsStore;
89 private volatile CookieStore cookieStore;
90
91 Executor(final CloseableHttpClient httpclient) {
92 super();
93 this.httpclient = httpclient;
94 this.authCache = new BasicAuthCache();
95 }
96
97
98
99
100 public Executor use(final CredentialsStore credentialsStore) {
101 this.credentialsStore = credentialsStore;
102 return this;
103 }
104
105 public Executor auth(final AuthScope authScope, final Credentials credentials) {
106 CredentialsStore credentialsStoreSnapshot = credentialsStore;
107 if (credentialsStoreSnapshot == null) {
108 credentialsStoreSnapshot = new BasicCredentialsProvider();
109 this.credentialsStore = credentialsStoreSnapshot;
110 }
111 credentialsStoreSnapshot.setCredentials(authScope, credentials);
112 return this;
113 }
114
115 public Executor auth(final HttpHost host, final Credentials credentials) {
116 return auth(new AuthScope(host), credentials);
117 }
118
119
120
121
122 public Executor auth(final String host, final Credentials credentials) {
123 final HttpHost httpHost;
124 try {
125 httpHost = HttpHost.create(host);
126 } catch (final URISyntaxException ex) {
127 throw new IllegalArgumentException("Invalid host: " + host);
128 }
129 return auth(httpHost, credentials);
130 }
131
132 public Executor authPreemptive(final HttpHost host) {
133 final CredentialsStore credentialsStoreSnapshot = credentialsStore;
134 if (credentialsStoreSnapshot != null) {
135 final Credentials credentials = credentialsStoreSnapshot.getCredentials(new AuthScope(host), null);
136 if (credentials != null) {
137 final BasicScheme basicScheme = new BasicScheme();
138 basicScheme.initPreemptive(credentials);
139 this.authCache.put(host, basicScheme);
140 }
141 }
142 return this;
143 }
144
145
146
147
148 public Executor authPreemptive(final String host) {
149 final HttpHost httpHost;
150 try {
151 httpHost = HttpHost.create(host);
152 } catch (final URISyntaxException ex) {
153 throw new IllegalArgumentException("Invalid host: " + host);
154 }
155 return authPreemptive(httpHost);
156 }
157
158 public Executor authPreemptiveProxy(final HttpHost proxy) {
159 final CredentialsStore credentialsStoreSnapshot = credentialsStore;
160 if (credentialsStoreSnapshot != null) {
161 final Credentials credentials = credentialsStoreSnapshot.getCredentials(new AuthScope(proxy), null);
162 if (credentials != null) {
163 final BasicScheme basicScheme = new BasicScheme();
164 basicScheme.initPreemptive(credentials);
165 this.authCache.put(proxy, basicScheme);
166 }
167 }
168 return this;
169 }
170
171
172
173
174 public Executor authPreemptiveProxy(final String proxy) {
175 final HttpHost httpHost;
176 try {
177 httpHost = HttpHost.create(proxy);
178 } catch (final URISyntaxException ex) {
179 throw new IllegalArgumentException("Invalid host: " + proxy);
180 }
181 return authPreemptiveProxy(httpHost);
182 }
183
184 public Executor auth(final HttpHost host,
185 final String username, final char[] password) {
186 return auth(host, new UsernamePasswordCredentials(username, password));
187 }
188
189 public Executor auth(final HttpHost host,
190 final String username, final char[] password,
191 final String workstation, final String domain) {
192 return auth(host, new NTCredentials(username, password, workstation, domain));
193 }
194
195 public Executor clearAuth() {
196 final CredentialsStore credentialsStoreSnapshot = credentialsStore;
197 if (credentialsStoreSnapshot != null) {
198 credentialsStoreSnapshot.clear();
199 }
200 return this;
201 }
202
203
204
205
206 public Executor use(final CookieStore cookieStore) {
207 this.cookieStore = cookieStore;
208 return this;
209 }
210
211 public Executor clearCookies() {
212 final CookieStore cookieStoreSnapshot = cookieStore;
213 if (cookieStoreSnapshot != null) {
214 cookieStoreSnapshot.clear();
215 }
216 return this;
217 }
218
219
220
221
222
223
224
225
226
227 public Response execute(
228 final Request request) throws IOException {
229 final HttpClientContext localContext = HttpClientContext.create();
230 final CredentialsStore credentialsStoreSnapshot = credentialsStore;
231 if (credentialsStoreSnapshot != null) {
232 localContext.setAttribute(HttpClientContext.CREDS_PROVIDER, credentialsStoreSnapshot);
233 }
234 if (this.authCache != null) {
235 localContext.setAttribute(HttpClientContext.AUTH_CACHE, this.authCache);
236 }
237 final CookieStore cookieStoreSnapshot = cookieStore;
238 if (cookieStoreSnapshot != null) {
239 localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStoreSnapshot);
240 }
241 return new Response(request.internalExecute(this.httpclient, localContext));
242 }
243
244 }