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