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.core5.http.nio.support;
29
30 import java.net.URI;
31 import java.net.URISyntaxException;
32 import java.nio.charset.Charset;
33 import java.util.Arrays;
34 import java.util.List;
35
36 import org.apache.hc.core5.http.ContentType;
37 import org.apache.hc.core5.http.Header;
38 import org.apache.hc.core5.http.HttpHost;
39 import org.apache.hc.core5.http.Method;
40 import org.apache.hc.core5.http.NameValuePair;
41 import org.apache.hc.core5.http.ProtocolVersion;
42 import org.apache.hc.core5.http.message.BasicHttpRequest;
43 import org.apache.hc.core5.http.nio.AsyncEntityProducer;
44 import org.apache.hc.core5.http.nio.AsyncRequestProducer;
45 import org.apache.hc.core5.http.nio.entity.BasicAsyncEntityProducer;
46 import org.apache.hc.core5.http.nio.entity.StringAsyncEntityProducer;
47 import org.apache.hc.core5.http.support.AbstractRequestBuilder;
48 import org.apache.hc.core5.net.URIAuthority;
49 import org.apache.hc.core5.net.URIBuilder;
50 import org.apache.hc.core5.net.WWWFormCodec;
51 import org.apache.hc.core5.util.Args;
52 import org.apache.hc.core5.util.TextUtils;
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public class AsyncRequestBuilder extends AbstractRequestBuilder<AsyncRequestProducer> {
67
68 private AsyncEntityProducer entityProducer;
69
70 AsyncRequestBuilder(final String method) {
71 super(method);
72 }
73
74 AsyncRequestBuilder(final Method method) {
75 super(method);
76 }
77
78 AsyncRequestBuilder(final String method, final URI uri) {
79 super(method, uri);
80 }
81
82 AsyncRequestBuilder(final Method method, final URI uri) {
83 this(method.name(), uri);
84 }
85
86 AsyncRequestBuilder(final Method method, final String uri) {
87 this(method.name(), uri != null ? URI.create(uri) : null);
88 }
89
90 AsyncRequestBuilder(final String method, final String uri) {
91 this(method, uri != null ? URI.create(uri) : null);
92 }
93
94 public static AsyncRequestBuilder create(final String method) {
95 Args.notBlank(method, "HTTP method");
96 return new AsyncRequestBuilder(method);
97 }
98
99 public static AsyncRequestBuilder get() {
100 return new AsyncRequestBuilder(Method.GET);
101 }
102
103 public static AsyncRequestBuilder get(final URI uri) {
104 return new AsyncRequestBuilder(Method.GET, uri);
105 }
106
107 public static AsyncRequestBuilder get(final String uri) {
108 return new AsyncRequestBuilder(Method.GET, uri);
109 }
110
111 public static AsyncRequestBuilder head() {
112 return new AsyncRequestBuilder(Method.HEAD);
113 }
114
115 public static AsyncRequestBuilder head(final URI uri) {
116 return new AsyncRequestBuilder(Method.HEAD, uri);
117 }
118
119 public static AsyncRequestBuilder head(final String uri) {
120 return new AsyncRequestBuilder(Method.HEAD, uri);
121 }
122
123 public static AsyncRequestBuilder patch() {
124 return new AsyncRequestBuilder(Method.PATCH);
125 }
126
127 public static AsyncRequestBuilder patch(final URI uri) {
128 return new AsyncRequestBuilder(Method.PATCH, uri);
129 }
130
131 public static AsyncRequestBuilder patch(final String uri) {
132 return new AsyncRequestBuilder(Method.PATCH, uri);
133 }
134
135 public static AsyncRequestBuilder post() {
136 return new AsyncRequestBuilder(Method.POST);
137 }
138
139 public static AsyncRequestBuilder post(final URI uri) {
140 return new AsyncRequestBuilder(Method.POST, uri);
141 }
142
143 public static AsyncRequestBuilder post(final String uri) {
144 return new AsyncRequestBuilder(Method.POST, uri);
145 }
146
147 public static AsyncRequestBuilder put() {
148 return new AsyncRequestBuilder(Method.PUT);
149 }
150
151 public static AsyncRequestBuilder put(final URI uri) {
152 return new AsyncRequestBuilder(Method.PUT, uri);
153 }
154
155 public static AsyncRequestBuilder put(final String uri) {
156 return new AsyncRequestBuilder(Method.PUT, uri);
157 }
158
159 public static AsyncRequestBuilder delete() {
160 return new AsyncRequestBuilder(Method.DELETE);
161 }
162
163 public static AsyncRequestBuilder delete(final URI uri) {
164 return new AsyncRequestBuilder(Method.DELETE, uri);
165 }
166
167 public static AsyncRequestBuilder delete(final String uri) {
168 return new AsyncRequestBuilder(Method.DELETE, uri);
169 }
170
171 public static AsyncRequestBuilder trace() {
172 return new AsyncRequestBuilder(Method.TRACE);
173 }
174
175 public static AsyncRequestBuilder trace(final URI uri) {
176 return new AsyncRequestBuilder(Method.TRACE, uri);
177 }
178
179 public static AsyncRequestBuilder trace(final String uri) {
180 return new AsyncRequestBuilder(Method.TRACE, uri);
181 }
182
183 public static AsyncRequestBuilder options() {
184 return new AsyncRequestBuilder(Method.OPTIONS);
185 }
186
187 public static AsyncRequestBuilder options(final URI uri) {
188 return new AsyncRequestBuilder(Method.OPTIONS, uri);
189 }
190
191 public static AsyncRequestBuilder options(final String uri) {
192 return new AsyncRequestBuilder(Method.OPTIONS, uri);
193 }
194
195 @Override
196 public AsyncRequestBuilder setVersion(final ProtocolVersion version) {
197 super.setVersion(version);
198 return this;
199 }
200
201 @Override
202 public AsyncRequestBuilder setUri(final URI uri) {
203 super.setUri(uri);
204 return this;
205 }
206
207 @Override
208 public AsyncRequestBuilder setUri(final String uri) {
209 super.setUri(uri);
210 return this;
211 }
212
213 @Override
214 public AsyncRequestBuilder setScheme(final String scheme) {
215 super.setScheme(scheme);
216 return this;
217 }
218
219 @Override
220 public AsyncRequestBuilder setAuthority(final URIAuthority authority) {
221 super.setAuthority(authority);
222 return this;
223 }
224
225
226
227
228 @Override
229 public AsyncRequestBuilder setHttpHost(final HttpHost httpHost) {
230 super.setHttpHost(httpHost);
231 return this;
232 }
233
234 @Override
235 public AsyncRequestBuilder setPath(final String path) {
236 super.setPath(path);
237 return this;
238 }
239
240 @Override
241 public AsyncRequestBuilder setHeaders(final Header... headers) {
242 super.setHeaders(headers);
243 return this;
244 }
245
246 @Override
247 public AsyncRequestBuilder addHeader(final Header header) {
248 super.addHeader(header);
249 return this;
250 }
251
252 @Override
253 public AsyncRequestBuilder addHeader(final String name, final String value) {
254 super.addHeader(name, value);
255 return this;
256 }
257
258 @Override
259 public AsyncRequestBuilder removeHeader(final Header header) {
260 super.removeHeader(header);
261 return this;
262 }
263
264 @Override
265 public AsyncRequestBuilder removeHeaders(final String name) {
266 super.removeHeaders(name);
267 return this;
268 }
269
270 @Override
271 public AsyncRequestBuilder setHeader(final Header header) {
272 super.setHeader(header);
273 return this;
274 }
275
276 @Override
277 public AsyncRequestBuilder setHeader(final String name, final String value) {
278 super.setHeader(name, value);
279 return this;
280 }
281
282 @Override
283 public AsyncRequestBuilder setCharset(final Charset charset) {
284 super.setCharset(charset);
285 return this;
286 }
287
288 @Override
289 public AsyncRequestBuilder addParameter(final NameValuePair nvp) {
290 super.addParameter(nvp);
291 return this;
292 }
293
294 @Override
295 public AsyncRequestBuilder addParameter(final String name, final String value) {
296 super.addParameter(name, value);
297 return this;
298 }
299
300 @Override
301 public AsyncRequestBuilder addParameters(final NameValuePair... nvps) {
302 super.addParameters(nvps);
303 return this;
304 }
305
306 @Override
307 public AsyncRequestBuilder setAbsoluteRequestUri(final boolean absoluteRequestUri) {
308 super.setAbsoluteRequestUri(absoluteRequestUri);
309 return this;
310 }
311
312 public AsyncEntityProducer getEntity() {
313 return entityProducer;
314 }
315
316 public AsyncRequestBuilder setEntity(final AsyncEntityProducer entityProducer) {
317 this.entityProducer = entityProducer;
318 return this;
319 }
320
321 public AsyncRequestBuilder setEntity(final String content, final ContentType contentType) {
322 this.entityProducer = new BasicAsyncEntityProducer(content, contentType);
323 return this;
324 }
325
326 public AsyncRequestBuilder setEntity(final String content) {
327 this.entityProducer = new BasicAsyncEntityProducer(content);
328 return this;
329 }
330
331 public AsyncRequestBuilder setEntity(final byte[] content, final ContentType contentType) {
332 this.entityProducer = new BasicAsyncEntityProducer(content, contentType);
333 return this;
334 }
335
336 @Override
337 public AsyncRequestProducer build() {
338 String path = getPath();
339 if (TextUtils.isEmpty(path)) {
340 path = "/";
341 }
342 AsyncEntityProducer entityProducerCopy = entityProducer;
343 final String method = getMethod();
344 final List<NameValuePair> parameters = getParameters();
345 if (parameters != null && !parameters.isEmpty()) {
346 final Charset charset = getCharset();
347 if (entityProducerCopy == null && (Method.POST.isSame(method) || Method.PUT.isSame(method))) {
348 final String content = WWWFormCodec.format(
349 parameters,
350 charset != null ? charset : ContentType.APPLICATION_FORM_URLENCODED.getCharset());
351 entityProducerCopy = new StringAsyncEntityProducer(
352 content,
353 ContentType.APPLICATION_FORM_URLENCODED);
354 } else {
355 try {
356 final URI uri = new URIBuilder(path)
357 .setCharset(charset)
358 .addParameters(parameters)
359 .build();
360 path = uri.toASCIIString();
361 } catch (final URISyntaxException ex) {
362
363 }
364 }
365 }
366
367 if (entityProducerCopy != null && Method.TRACE.isSame(method)) {
368 throw new IllegalStateException(Method.TRACE + " requests may not include an entity");
369 }
370
371 final BasicHttpRequest request = new BasicHttpRequest(method, getScheme(), getAuthority(), path);
372 request.setVersion(getVersion());
373 request.setHeaders(getHeaders());
374 request.setAbsoluteRequestUri(isAbsoluteRequestUri());
375 return new BasicRequestProducer(request, entityProducerCopy);
376 }
377
378 @Override
379 public String toString() {
380 final StringBuilder builder = new StringBuilder();
381 builder.append("AsyncRequestBuilder [method=");
382 builder.append(getMethod());
383 builder.append(", scheme=");
384 builder.append(getScheme());
385 builder.append(", authority=");
386 builder.append(getAuthority());
387 builder.append(", path=");
388 builder.append(getPath());
389 builder.append(", parameters=");
390 builder.append(getParameters());
391 builder.append(", headerGroup=");
392 builder.append(Arrays.toString(getHeaders()));
393 builder.append(", entity=");
394 builder.append(entityProducer != null ? entityProducer.getClass() : null);
395 builder.append("]");
396 return builder.toString();
397 }
398
399 }