Improved parameter copying in RequestBuilder

git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1573001 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Oleg Kalnichevski 2014-02-28 17:05:52 +00:00
parent 10ee968607
commit 298b237045
2 changed files with 203 additions and 12 deletions

View File

@ -27,6 +27,7 @@
package org.apache.http.client.methods; package org.apache.http.client.methods;
import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.ArrayList; import java.util.ArrayList;
@ -44,6 +45,8 @@ import org.apache.http.annotation.NotThreadSafe;
import org.apache.http.client.config.RequestConfig; import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.utils.URIBuilder; import org.apache.http.client.utils.URIBuilder;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.entity.ContentType;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair; import org.apache.http.message.BasicNameValuePair;
import org.apache.http.message.HeaderGroup; import org.apache.http.message.HeaderGroup;
@ -69,7 +72,7 @@ public class RequestBuilder {
private URI uri; private URI uri;
private HeaderGroup headergroup; private HeaderGroup headergroup;
private HttpEntity entity; private HttpEntity entity;
private LinkedList<NameValuePair> parameters; private List<NameValuePair> parameters;
private RequestConfig config; private RequestConfig config;
RequestBuilder(final String method) { RequestBuilder(final String method) {
@ -77,6 +80,18 @@ public class RequestBuilder {
this.method = method; this.method = method;
} }
RequestBuilder(final String method, final URI uri) {
super();
this.method = method;
this.uri = uri;
}
RequestBuilder(final String method, final String uri) {
super();
this.method = method;
this.uri = uri != null ? URI.create(uri) : null;
}
RequestBuilder() { RequestBuilder() {
this(null); this(null);
} }
@ -90,30 +105,128 @@ public class RequestBuilder {
return new RequestBuilder(HttpGet.METHOD_NAME); return new RequestBuilder(HttpGet.METHOD_NAME);
} }
/**
* @since 4.4
*/
public static RequestBuilder get(final URI uri) {
return new RequestBuilder(HttpGet.METHOD_NAME, uri);
}
/**
* @since 4.4
*/
public static RequestBuilder get(final String uri) {
return new RequestBuilder(HttpGet.METHOD_NAME, uri);
}
public static RequestBuilder head() { public static RequestBuilder head() {
return new RequestBuilder(HttpHead.METHOD_NAME); return new RequestBuilder(HttpHead.METHOD_NAME);
} }
/**
* @since 4.4
*/
public static RequestBuilder head(final URI uri) {
return new RequestBuilder(HttpHead.METHOD_NAME, uri);
}
/**
* @since 4.4
*/
public static RequestBuilder head(final String uri) {
return new RequestBuilder(HttpHead.METHOD_NAME, uri);
}
public static RequestBuilder post() { public static RequestBuilder post() {
return new RequestBuilder(HttpPost.METHOD_NAME); return new RequestBuilder(HttpPost.METHOD_NAME);
} }
/**
* @since 4.4
*/
public static RequestBuilder post(final URI uri) {
return new RequestBuilder(HttpPost.METHOD_NAME, uri);
}
/**
* @since 4.4
*/
public static RequestBuilder post(final String uri) {
return new RequestBuilder(HttpPost.METHOD_NAME, uri);
}
public static RequestBuilder put() { public static RequestBuilder put() {
return new RequestBuilder(HttpPut.METHOD_NAME); return new RequestBuilder(HttpPut.METHOD_NAME);
} }
/**
* @since 4.4
*/
public static RequestBuilder put(final URI uri) {
return new RequestBuilder(HttpPut.METHOD_NAME, uri);
}
/**
* @since 4.4
*/
public static RequestBuilder put(final String uri) {
return new RequestBuilder(HttpPut.METHOD_NAME, uri);
}
public static RequestBuilder delete() { public static RequestBuilder delete() {
return new RequestBuilder(HttpDelete.METHOD_NAME); return new RequestBuilder(HttpDelete.METHOD_NAME);
} }
/**
* @since 4.4
*/
public static RequestBuilder delete(final URI uri) {
return new RequestBuilder(HttpDelete.METHOD_NAME, uri);
}
/**
* @since 4.4
*/
public static RequestBuilder delete(final String uri) {
return new RequestBuilder(HttpDelete.METHOD_NAME, uri);
}
public static RequestBuilder trace() { public static RequestBuilder trace() {
return new RequestBuilder(HttpTrace.METHOD_NAME); return new RequestBuilder(HttpTrace.METHOD_NAME);
} }
/**
* @since 4.4
*/
public static RequestBuilder trace(final URI uri) {
return new RequestBuilder(HttpTrace.METHOD_NAME, uri);
}
/**
* @since 4.4
*/
public static RequestBuilder trace(final String uri) {
return new RequestBuilder(HttpTrace.METHOD_NAME, uri);
}
public static RequestBuilder options() { public static RequestBuilder options() {
return new RequestBuilder(HttpOptions.METHOD_NAME); return new RequestBuilder(HttpOptions.METHOD_NAME);
} }
/**
* @since 4.4
*/
public static RequestBuilder options(final URI uri) {
return new RequestBuilder(HttpOptions.METHOD_NAME, uri);
}
/**
* @since 4.4
*/
public static RequestBuilder options(final String uri) {
return new RequestBuilder(HttpOptions.METHOD_NAME, uri);
}
public static RequestBuilder copy(final HttpRequest request) { public static RequestBuilder copy(final HttpRequest request) {
Args.notNull(request, "HTTP request"); Args.notNull(request, "HTTP request");
return new RequestBuilder().doCopy(request); return new RequestBuilder().doCopy(request);
@ -125,27 +238,62 @@ public class RequestBuilder {
} }
method = request.getRequestLine().getMethod(); method = request.getRequestLine().getMethod();
version = request.getRequestLine().getProtocolVersion(); version = request.getRequestLine().getProtocolVersion();
if (request instanceof HttpUriRequest) {
uri = ((HttpUriRequest) request).getURI();
} else {
uri = URI.create(request.getRequestLine().getMethod());
}
if (headergroup == null) { if (headergroup == null) {
headergroup = new HeaderGroup(); headergroup = new HeaderGroup();
} }
headergroup.clear(); headergroup.clear();
headergroup.setHeaders(request.getAllHeaders()); headergroup.setHeaders(request.getAllHeaders());
if (request instanceof HttpEntityEnclosingRequest) {
entity = ((HttpEntityEnclosingRequest) request).getEntity(); parameters = null;
} else {
entity = null; entity = null;
if (request instanceof HttpEntityEnclosingRequest) {
final HttpEntity originalEntity = ((HttpEntityEnclosingRequest) request).getEntity();
final ContentType contentType = ContentType.get(originalEntity);
if (contentType != null &&
contentType.getMimeType().equals(ContentType.APPLICATION_FORM_URLENCODED.getMimeType())) {
try {
final List<NameValuePair> formParams = URLEncodedUtils.parse(originalEntity);
if (!formParams.isEmpty()) {
parameters = formParams;
}
} catch (IOException ignore) {
} }
if (request instanceof Configurable) {
this.config = ((Configurable) request).getConfig();
} else { } else {
this.config = null; entity = originalEntity;
}
}
final URI originalUri;
if (request instanceof HttpUriRequest) {
originalUri = ((HttpUriRequest) request).getURI();
} else {
originalUri = URI.create(request.getRequestLine().getUri());
}
final URIBuilder uriBuilder = new URIBuilder(originalUri);
if (parameters == null) {
final List<NameValuePair> queryParams = uriBuilder.getQueryParams();
if (!queryParams.isEmpty()) {
parameters = queryParams;
uriBuilder.clearParameters();
} else {
parameters = null;
}
}
try {
uri = uriBuilder.build();
} catch (URISyntaxException ex) {
// Should never happen
uri = originalUri;
}
if (request instanceof Configurable) {
config = ((Configurable) request).getConfig();
} else {
config = null;
} }
this.parameters = null;
return this; return this;
} }

View File

@ -28,13 +28,16 @@
package org.apache.http.client.methods; package org.apache.http.client.methods;
import java.net.URI; import java.net.URI;
import java.util.List;
import org.apache.http.Header; import org.apache.http.Header;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpVersion; import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig; import org.apache.http.client.config.RequestConfig;
import org.apache.http.entity.BasicHttpEntity; import org.apache.http.entity.BasicHttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity; import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair; import org.apache.http.message.BasicNameValuePair;
@ -159,6 +162,46 @@ public class TestRequestBuilder {
Assert.assertSame(config, ((Configurable) copy).getConfig()); Assert.assertSame(config, ((Configurable) copy).getConfig());
} }
@Test
public void testCopyWithQueryParams() throws Exception {
final HttpGet get = new HttpGet("/stuff?p1=this&p2=that");
final RequestBuilder builder = RequestBuilder.copy(get);
final List<NameValuePair> parameters = builder.getParameters();
Assert.assertNotNull(parameters);
Assert.assertEquals(2, parameters.size());
Assert.assertEquals(new BasicNameValuePair("p1", "this"), parameters.get(0));
Assert.assertEquals(new BasicNameValuePair("p2", "that"), parameters.get(1));
Assert.assertEquals(new URI("/stuff"), builder.getUri());
}
@Test
public void testCopyWithFormParams() throws Exception {
final HttpPost post = new HttpPost("/stuff?p1=wtf");
post.setEntity(new StringEntity("p1=this&p2=that", ContentType.APPLICATION_FORM_URLENCODED));
final RequestBuilder builder = RequestBuilder.copy(post);
final List<NameValuePair> parameters = builder.getParameters();
Assert.assertNotNull(parameters);
Assert.assertEquals(2, parameters.size());
Assert.assertEquals(new BasicNameValuePair("p1", "this"), parameters.get(0));
Assert.assertEquals(new BasicNameValuePair("p2", "that"), parameters.get(1));
Assert.assertEquals(new URI("/stuff?p1=wtf"), builder.getUri());
Assert.assertNull(builder.getEntity());
}
@Test
public void testCopyWithStringEntity() throws Exception {
final HttpPost post = new HttpPost("/stuff?p1=wtf");
final HttpEntity entity = new StringEntity("p1=this&p2=that", ContentType.TEXT_PLAIN);
post.setEntity(entity);
final RequestBuilder builder = RequestBuilder.copy(post);
final List<NameValuePair> parameters = builder.getParameters();
Assert.assertNotNull(parameters);
Assert.assertEquals(1, parameters.size());
Assert.assertEquals(new BasicNameValuePair("p1", "wtf"), parameters.get(0));
Assert.assertEquals(new URI("/stuff"), builder.getUri());
Assert.assertSame(entity, builder.getEntity());
}
@Test @Test
public void testGettersAndMutators() throws Exception { public void testGettersAndMutators() throws Exception {
final HttpEntity entity = new StringEntity("stuff"); final HttpEntity entity = new StringEntity("stuff");