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