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 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 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     @Override
223     protected void digest(final HttpRequest request) {
224         super.digest(request);
225     }
226 
227     @Override
228     public SimpleRequestBuilder setVersion(final ProtocolVersion version) {
229         super.setVersion(version);
230         return this;
231     }
232 
233     @Override
234     public SimpleRequestBuilder setUri(final URI uri) {
235         super.setUri(uri);
236         return this;
237     }
238 
239     @Override
240     public SimpleRequestBuilder setUri(final String uri) {
241         super.setUri(uri);
242         return this;
243     }
244 
245     @Override
246     public SimpleRequestBuilder setScheme(final String scheme) {
247         super.setScheme(scheme);
248         return this;
249     }
250 
251     @Override
252     public SimpleRequestBuilder setAuthority(final URIAuthority authority) {
253         super.setAuthority(authority);
254         return this;
255     }
256 
257     @Override
258     public SimpleRequestBuilder setHttpHost(final HttpHost httpHost) {
259         super.setHttpHost(httpHost);
260         return this;
261     }
262 
263     @Override
264     public SimpleRequestBuilder setPath(final String path) {
265         super.setPath(path);
266         return this;
267     }
268 
269     @Override
270     public SimpleRequestBuilder setHeaders(final Header... headers) {
271         super.setHeaders(headers);
272         return this;
273     }
274 
275     @Override
276     public SimpleRequestBuilder addHeader(final Header header) {
277         super.addHeader(header);
278         return this;
279     }
280 
281     @Override
282     public SimpleRequestBuilder addHeader(final String name, final String value) {
283         super.addHeader(name, value);
284         return this;
285     }
286 
287     @Override
288     public SimpleRequestBuilder removeHeader(final Header header) {
289         super.removeHeader(header);
290         return this;
291     }
292 
293     @Override
294     public SimpleRequestBuilder removeHeaders(final String name) {
295         super.removeHeaders(name);
296         return this;
297     }
298 
299     @Override
300     public SimpleRequestBuilder setHeader(final Header header) {
301         super.setHeader(header);
302         return this;
303     }
304 
305     @Override
306     public SimpleRequestBuilder setHeader(final String name, final String value) {
307         super.setHeader(name, value);
308         return this;
309     }
310 
311     @Override
312     public SimpleRequestBuilder setCharset(final Charset charset) {
313         super.setCharset(charset);
314         return this;
315     }
316 
317     @Override
318     public SimpleRequestBuilder addParameter(final NameValuePair nvp) {
319         super.addParameter(nvp);
320         return this;
321     }
322 
323     @Override
324     public SimpleRequestBuilder addParameter(final String name, final String value) {
325         super.addParameter(name, value);
326         return this;
327     }
328 
329     @Override
330     public SimpleRequestBuilder addParameters(final NameValuePair... nvps) {
331         super.addParameters(nvps);
332         return this;
333     }
334 
335     @Override
336     public SimpleRequestBuilder setAbsoluteRequestUri(final boolean absoluteRequestUri) {
337         super.setAbsoluteRequestUri(absoluteRequestUri);
338         return this;
339     }
340 
341     public SimpleBody getBody() {
342         return body;
343     }
344 
345     public SimpleRequestBuilder setBody(final SimpleBody body) {
346         this.body = body;
347         return this;
348     }
349 
350     public SimpleRequestBuilder setBody(final String content, final ContentType contentType) {
351         this.body = SimpleBody.create(content, contentType);
352         return this;
353     }
354 
355     public SimpleRequestBuilder setBody(final byte[] content, final ContentType contentType) {
356         this.body = SimpleBody.create(content, contentType);
357         return this;
358     }
359 
360     public RequestConfig getRequestConfig() {
361         return requestConfig;
362     }
363 
364     public SimpleRequestBuilder setRequestConfig(final RequestConfig requestConfig) {
365         this.requestConfig = requestConfig;
366         return this;
367     }
368 
369     @Override
370     public SimpleHttpRequest build() {
371         String path = getPath();
372         SimpleBody bodyCopy = this.body;
373         final String method = getMethod();
374         final List<NameValuePair> parameters = getParameters();
375         if (parameters != null && !parameters.isEmpty()) {
376             final Charset charsetCopy = getCharset();
377             if (bodyCopy == null && (Method.POST.isSame(method) || Method.PUT.isSame(method))) {
378                 final String content = WWWFormCodec.format(
379                         parameters,
380                         charsetCopy != null ? charsetCopy : ContentType.APPLICATION_FORM_URLENCODED.getCharset());
381                 bodyCopy = SimpleBody.create(content, ContentType.APPLICATION_FORM_URLENCODED);
382             } else {
383                 try {
384                     final URI uri = new URIBuilder(path)
385                             .setCharset(charsetCopy)
386                             .addParameters(parameters)
387                             .build();
388                     path = uri.toASCIIString();
389                 } catch (final URISyntaxException ex) {
390                     // should never happen
391                 }
392             }
393         }
394 
395         if (bodyCopy != null && Method.TRACE.isSame(method)) {
396             throw new IllegalStateException(Method.TRACE + " requests may not include an entity");
397         }
398 
399         final SimpleHttpRequest result = new SimpleHttpRequest(method, getScheme(), getAuthority(), path);
400         result.setVersion(getVersion());
401         result.setHeaders(getHeaders());
402         result.setBody(bodyCopy);
403         result.setAbsoluteRequestUri(isAbsoluteRequestUri());
404         result.setConfig(requestConfig);
405         return result;
406     }
407 
408     @Override
409     public String toString() {
410         final StringBuilder builder = new StringBuilder();
411         builder.append("ClassicRequestBuilder [method=");
412         builder.append(getMethod());
413         builder.append(", scheme=");
414         builder.append(getScheme());
415         builder.append(", authority=");
416         builder.append(getAuthority());
417         builder.append(", path=");
418         builder.append(getPath());
419         builder.append(", parameters=");
420         builder.append(getParameters());
421         builder.append(", headerGroup=");
422         builder.append(Arrays.toString(getHeaders()));
423         builder.append(", body=");
424         builder.append(body);
425         builder.append("]");
426         return builder.toString();
427     }
428 
429 }