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:
parent
10ee968607
commit
298b237045
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue