hc-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ol...@apache.org
Subject svn commit: r1426353 - in /httpcomponents/httpclient/trunk/httpclient/src: main/java/org/apache/http/client/methods/RequestBuilder.java main/java/org/apache/http/client/utils/URIBuilder.java test/java/org/apache/http/client/methods/TestRequestBuilder.java
Date Thu, 27 Dec 2012 22:26:54 GMT
Author: olegk
Date: Thu Dec 27 22:26:53 2012
New Revision: 1426353

URL: http://svn.apache.org/viewvc?rev=1426353&view=rev
Log:
HTTPCLIENT-1253: RequestBuilder to support request parameters that can be transmitted either
in the request body or in the request URI depending on composition of the request

Modified:
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/methods/TestRequestBuilder.java

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java?rev=1426353&r1=1426352&r2=1426353&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java
(original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java
Thu Dec 27 22:26:53 2012
@@ -28,18 +28,27 @@
 package org.apache.http.client.methods;
 
 import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
 
 import org.apache.http.Header;
 import org.apache.http.HeaderIterator;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpRequest;
+import org.apache.http.NameValuePair;
 import org.apache.http.ProtocolVersion;
 import org.apache.http.annotation.NotThreadSafe;
 import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.utils.CloneUtils;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.utils.URIBuilder;
 import org.apache.http.message.BasicHeader;
+import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.message.HeaderGroup;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.util.Args;
 
 /**
  * @since 4.3
@@ -52,6 +61,7 @@ public class RequestBuilder {
     private URI uri;
     private HeaderGroup headergroup;
     private HttpEntity entity;
+    private LinkedList<NameValuePair> parameters;
     private RequestConfig config;
 
     RequestBuilder(final String method) {
@@ -64,45 +74,43 @@ public class RequestBuilder {
     }
 
     public static RequestBuilder create(final String method) {
+        Args.notBlank(method, "HTTP method");
         return new RequestBuilder(method);
     }
 
-    public static RequestBuilder createGet() {
+    public static RequestBuilder get() {
         return new RequestBuilder(HttpGet.METHOD_NAME);
     }
 
-    public static RequestBuilder createHead() {
+    public static RequestBuilder head() {
         return new RequestBuilder(HttpHead.METHOD_NAME);
     }
 
-    public static RequestBuilder createPost() {
+    public static RequestBuilder post() {
         return new RequestBuilder(HttpPost.METHOD_NAME);
     }
 
-    public static RequestBuilder createPut() {
+    public static RequestBuilder put() {
         return new RequestBuilder(HttpPut.METHOD_NAME);
     }
 
-    public static RequestBuilder createDelete() {
+    public static RequestBuilder delete() {
         return new RequestBuilder(HttpDelete.METHOD_NAME);
     }
 
-    public static RequestBuilder createTrace() {
+    public static RequestBuilder trace() {
         return new RequestBuilder(HttpTrace.METHOD_NAME);
     }
 
-    public static RequestBuilder createOptions() {
+    public static RequestBuilder options() {
         return new RequestBuilder(HttpOptions.METHOD_NAME);
     }
 
     public static RequestBuilder copy(final HttpRequest request) {
+        Args.notNull(request, "HTTP request");
         return new RequestBuilder().doCopy(request);
     }
 
-    public static RequestBuilder clone(final HttpRequest request) throws CloneNotSupportedException
{
-        return new RequestBuilder().doCopy(CloneUtils.cloneObject(request));
-    }
-
     private RequestBuilder doCopy(final HttpRequest request) {
         if (request == null) {
             return this;
@@ -129,6 +137,7 @@ public class RequestBuilder {
         } else {
             this.config = null;
         }
+        this.parameters = null;
         return this;
     }
 
@@ -136,11 +145,6 @@ public class RequestBuilder {
         return method;
     }
 
-    public RequestBuilder setMethod(final String method) {
-        this.method = method;
-        return this;
-    }
-
     public ProtocolVersion getVersion() {
         return version;
     }
@@ -238,6 +242,31 @@ public class RequestBuilder {
         return this;
     }
 
+    public List<NameValuePair> getParameters() {
+        return parameters != null ? new ArrayList<NameValuePair>(parameters) :
+            new ArrayList<NameValuePair>();
+    }
+
+    public RequestBuilder addParameter(final NameValuePair nvp) {
+        Args.notNull(nvp, "Name value pair");
+        if (parameters == null) {
+            parameters = new LinkedList<NameValuePair>();
+        }
+        parameters.add(nvp);
+        return this;
+    }
+
+    public RequestBuilder addParameter(final String name, final String value) {
+        return addParameter(new BasicNameValuePair(name, value));
+    }
+
+    public RequestBuilder addParameters(final NameValuePair... nvps) {
+        for (NameValuePair nvp: nvps) {
+            addParameter(nvp);
+        }
+        return this;
+    }
+
     public RequestConfig getConfig() {
         return config;
     }
@@ -247,24 +276,32 @@ public class RequestBuilder {
         return this;
     }
 
-    private String getMethodName() {
-        return this.method != null ? this.method : 
-            (this.entity != null ? HttpPost.METHOD_NAME : HttpGet.METHOD_NAME);
-    }
-
     public HttpUriRequest build() {
         HttpRequestBase result;
-        String methodName = getMethodName();
-        if (this.entity == null) {
-            InternalRequest request = new InternalRequest(methodName);
+        URI uri = this.uri != null ? this.uri : URI.create("/");
+        HttpEntity entity = this.entity;
+        if (parameters != null && !parameters.isEmpty()) {
+            if (entity == null && (HttpPost.METHOD_NAME.equalsIgnoreCase(method)
+                    || HttpPut.METHOD_NAME.equalsIgnoreCase(method))) {
+                entity = new UrlEncodedFormEntity(parameters, HTTP.DEF_CONTENT_CHARSET);
+            } else {
+                try {
+                    uri = new URIBuilder(uri).addParameters(parameters).build();
+                } catch (URISyntaxException ex) {
+                    // should never happen
+                }
+            }
+        }
+        if (entity == null) {
+            InternalRequest request = new InternalRequest(method);
             result = request;
         } else {
-            InternalEntityEclosingRequest request = new InternalEntityEclosingRequest(methodName);
-            request.setEntity(this.entity);
+            InternalEntityEclosingRequest request = new InternalEntityEclosingRequest(method);
+            request.setEntity(entity);
             result = request;
         }
         result.setProtocolVersion(this.version);
-        result.setURI(this.uri != null ? this.uri : URI.create("/"));
+        result.setURI(uri);
         if (this.headergroup != null) {
             result.setHeaders(this.headergroup.getAllHeaders());
         }

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java?rev=1426353&r1=1426352&r2=1426353&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java
(original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java
Thu Dec 27 22:26:53 2012
@@ -293,6 +293,26 @@ public class URIBuilder {
     }
     
     /**
+     * Adds URI query parameters. The parameter name / values are expected to be unescaped
+     * and may contain non ASCII characters.
+     * <p/>
+     * Please note query parameters and custom query component are mutually exclusive. This
method
+     * will remove custom query if present.
+     * 
+     * @since 4.3
+     */
+    public URIBuilder addParameters(final List <NameValuePair> nvps) {
+        if (this.queryParams == null) {
+            this.queryParams = new ArrayList<NameValuePair>();
+        }
+        this.queryParams.addAll(nvps);
+        this.encodedQuery = null;
+        this.encodedSchemeSpecificPart = null;
+        this.query = null;
+        return this;
+    }
+    
+    /**
      * Sets URI query parameters. The parameter name / values are expected to be unescaped
      * and may contain non ASCII characters.
      * <p/>

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/methods/TestRequestBuilder.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/methods/TestRequestBuilder.java?rev=1426353&r1=1426352&r2=1426353&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/methods/TestRequestBuilder.java
(original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/methods/TestRequestBuilder.java
Thu Dec 27 22:26:53 2012
@@ -37,6 +37,8 @@ import org.apache.http.client.config.Req
 import org.apache.http.entity.BasicHttpEntity;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.message.BasicHeader;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -44,7 +46,7 @@ public class TestRequestBuilder {
 
     @Test
     public void testBasicGet() throws Exception {
-        HttpUriRequest request = RequestBuilder.createGet().build();
+        HttpUriRequest request = RequestBuilder.get().build();
         Assert.assertNotNull(request);
         Assert.assertEquals("GET", request.getMethod());
         Assert.assertEquals(URI.create("/"), request.getURI());
@@ -64,7 +66,7 @@ public class TestRequestBuilder {
     @Test
     public void testBasicWithEntity() throws Exception {
         HttpEntity entity = new BasicHttpEntity();
-        HttpUriRequest request = RequestBuilder.createPost().setEntity(entity).build();
+        HttpUriRequest request = RequestBuilder.post().setEntity(entity).build();
         Assert.assertNotNull(request);
         Assert.assertEquals("POST", request.getMethod());
         Assert.assertEquals(URI.create("/"), request.getURI());
@@ -76,7 +78,7 @@ public class TestRequestBuilder {
     @Test
     public void testGetWithEntity() throws Exception {
         HttpEntity entity = new BasicHttpEntity();
-        HttpUriRequest request = RequestBuilder.createGet().setEntity(entity).build();
+        HttpUriRequest request = RequestBuilder.get().setEntity(entity).build();
         Assert.assertNotNull(request);
         Assert.assertEquals("GET", request.getMethod());
         Assert.assertEquals(URI.create("/"), request.getURI());
@@ -86,10 +88,55 @@ public class TestRequestBuilder {
     }
 
     @Test
+    public void testAddParameters1() throws Exception {
+        HttpUriRequest request = RequestBuilder.get()
+                .addParameter("p1", "this")
+                .addParameter("p2", "that")
+                .build();
+        Assert.assertFalse(request instanceof HttpEntityEnclosingRequest);
+        Assert.assertEquals(new URI("/?p1=this&p2=that"), request.getURI());
+    }
+
+    @Test
+    public void testAddParameters2() throws Exception {
+        HttpUriRequest request = RequestBuilder.get()
+                .addParameter("p1", "this")
+                .addParameters(new BasicNameValuePair("p2", "that"))
+                .build();
+        Assert.assertFalse(request instanceof HttpEntityEnclosingRequest);
+        Assert.assertEquals(new URI("/?p1=this&p2=that"), request.getURI());
+    }
+
+    @Test
+    public void testAddParameters3() throws Exception {
+        HttpUriRequest request = RequestBuilder.post()
+                .addParameter("p1", "this")
+                .addParameter("p2", "that")
+                .build();
+        Assert.assertTrue(request instanceof HttpEntityEnclosingRequest);
+        HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
+        Assert.assertNotNull(entity);
+        Assert.assertEquals(new URI("/"), request.getURI());
+        Assert.assertEquals("p1=this&p2=that", EntityUtils.toString(entity));
+    }
+
+    @Test
+    public void testAddParameters4() throws Exception {
+        HttpUriRequest request = RequestBuilder.post()
+                .setUri("http://targethost/?blah")
+                .addParameter("p1", "this")
+                .addParameter("p2", "that")
+                .setEntity(new StringEntity("blah"))
+                .build();
+        Assert.assertTrue(request instanceof HttpEntityEnclosingRequest);
+        Assert.assertEquals(new URI("http://targethost/?blah&p1=this&p2=that"), request.getURI());
+    }
+
+    @Test
     public void testCopy() throws Exception {
         HttpEntity entity = new StringEntity("stuff");
         RequestConfig config = RequestConfig.custom().build();
-        HttpUriRequest request = RequestBuilder.createPut()
+        HttpUriRequest request = RequestBuilder.put()
             .setUri(URI.create("/stuff"))
             .setVersion(HttpVersion.HTTP_1_0)
             .addHeader("header1", "stuff")
@@ -113,48 +160,12 @@ public class TestRequestBuilder {
     }
 
     @Test
-    public void testClone() throws Exception {
-        HttpEntity entity = new StringEntity("stuff");
-        RequestConfig config = RequestConfig.custom().build();
-        HttpUriRequest request = RequestBuilder.createPut()
-            .setUri(URI.create("/stuff"))
-            .setVersion(HttpVersion.HTTP_1_0)
-            .addHeader("header1", "stuff")
-            .setHeader("header2", "more stuff")
-            .setEntity(entity)
-            .setConfig(config)
-            .build();
-        Assert.assertNotNull(request);
-        Assert.assertEquals("PUT", request.getMethod());
-        Assert.assertEquals(URI.create("/stuff"), request.getURI());
-        Assert.assertEquals(HttpVersion.HTTP_1_0, request.getProtocolVersion());
-        Assert.assertTrue(request instanceof HttpEntityEnclosingRequest);
-
-        HttpUriRequest clone = RequestBuilder.clone(request).setUri("/other-stuff").build();
-        Assert.assertEquals("PUT", clone.getMethod());
-        Assert.assertEquals(URI.create("/other-stuff"), clone.getURI());
-        Assert.assertTrue(clone instanceof HttpEntityEnclosingRequest);
-        Assert.assertNotNull(((HttpEntityEnclosingRequest) clone).getEntity());
-        Assert.assertNotSame(entity, ((HttpEntityEnclosingRequest) clone).getEntity());
-        Assert.assertTrue(clone instanceof Configurable);
-        Assert.assertSame(config, ((Configurable) clone).getConfig());
-    }
-
-    @Test
-    public void testCopyNull() throws Exception {
-        HttpUriRequest copy = RequestBuilder.copy(null).setUri("/other-stuff").build();
-        Assert.assertEquals("GET", copy.getMethod());
-        Assert.assertEquals(URI.create("/other-stuff"), copy.getURI());
-        Assert.assertFalse(copy instanceof HttpEntityEnclosingRequest);
-    }
-
-    @Test
     public void testGettersAndMutators() throws Exception {
         HttpEntity entity = new StringEntity("stuff");
         RequestConfig config = RequestConfig.custom().build();
         Header h1 = new BasicHeader("header1", "stuff");
         Header h2 = new BasicHeader("header1", "more-stuff");
-        RequestBuilder builder = RequestBuilder.createPut()
+        RequestBuilder builder = RequestBuilder.put()
             .setUri("/stuff")
             .setVersion(HttpVersion.HTTP_1_0)
             .addHeader(h1)
@@ -170,15 +181,13 @@ public class TestRequestBuilder {
         Assert.assertSame(entity, builder.getEntity());
         Assert.assertSame(config, builder.getConfig());
 
-        builder.setMethod(null)
-            .setUri((String) null)
+        builder.setUri((String) null)
             .setVersion(null)
             .removeHeader(h1)
             .removeHeaders("header1")
             .removeHeader(h2)
             .setEntity(null)
             .setConfig(null);
-        Assert.assertEquals(null, builder.getMethod());
         Assert.assertEquals(null, builder.getUri());
         Assert.assertEquals(null, builder.getVersion());
         Assert.assertSame(null, builder.getFirstHeader("header1"));
@@ -188,4 +197,9 @@ public class TestRequestBuilder {
         Assert.assertSame(null, builder.getConfig());
     }
 
+    @Test(expected=IllegalArgumentException.class)
+    public void testCopyNull() throws Exception {
+        RequestBuilder.copy(null);
+    }
+
 }



Mime
View raw message