From 2fda1b79f51f1c9bf0b4b5a49129ae15fa4ffb97 Mon Sep 17 00:00:00 2001 From: isabelabel Date: Tue, 27 May 2014 14:14:34 -0300 Subject: [PATCH 1/3] [RequestBuilder] Add the charset attribute to allow encode parameters using any valid charset, the default charset is UTF-8 --- .../http/client/methods/RequestBuilder.java | 17 ++++++- .../http/client/utils/TestRequestBuilder.java | 48 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 httpclient/src/test/java/org/apache/http/client/utils/TestRequestBuilder.java diff --git a/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java b/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java index 337dd43b36..8981a604c7 100644 --- a/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java +++ b/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java @@ -30,10 +30,12 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import org.apache.http.Consts; import org.apache.http.Header; import org.apache.http.HeaderIterator; import org.apache.http.HttpEntity; @@ -68,6 +70,7 @@ public class RequestBuilder { private String method; + private Charset charset = Consts.UTF_8; private ProtocolVersion version; private URI uri; private HeaderGroup headergroup; @@ -297,6 +300,15 @@ private RequestBuilder doCopy(final HttpRequest request) { return this; } + public RequestBuilder setCharset(Charset charset) { + this.charset = charset; + return this; + } + + public Charset getCharset() { + return charset; + } + public String getMethod() { return method; } @@ -442,7 +454,10 @@ public HttpUriRequest build() { entityCopy = new UrlEncodedFormEntity(parameters, HTTP.DEF_CONTENT_CHARSET); } else { try { - uriNotNull = new URIBuilder(uriNotNull).addParameters(parameters).build(); + uriNotNull = new URIBuilder(uriNotNull) + .setCharset(this.charset) + .addParameters(parameters) + .build(); } catch (final URISyntaxException ex) { // should never happen } diff --git a/httpclient/src/test/java/org/apache/http/client/utils/TestRequestBuilder.java b/httpclient/src/test/java/org/apache/http/client/utils/TestRequestBuilder.java new file mode 100644 index 0000000000..b27d9b1541 --- /dev/null +++ b/httpclient/src/test/java/org/apache/http/client/utils/TestRequestBuilder.java @@ -0,0 +1,48 @@ +package org.apache.http.client.utils; + + +import org.apache.http.Consts; +import org.apache.http.NameValuePair; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.message.BasicNameValuePair; +import org.junit.Assert; +import org.junit.Test; + +import java.net.URLEncoder; +import java.nio.charset.Charset; + +public class TestRequestBuilder { + + @Test + public void testBuildGETwithUTF8() throws Exception { + assertBuild(Consts.UTF_8); + } + + @Test + public void testBuildGETwithISO88591() throws Exception { + assertBuild(Consts.ISO_8859_1); + } + + private void assertBuild(Charset charset) throws Exception { + RequestBuilder requestBuilder = RequestBuilder.create("GET").setCharset(charset); + requestBuilder.setUri("https://somehost.com/stuff"); + requestBuilder.addParameters(createParameters()); + + String encodedData1 = URLEncoder.encode("\"1ª position\"", charset.displayName()); + String encodedData2 = URLEncoder.encode("José Abraão", charset.displayName()); + + String uriExpected = String.format("https://somehost.com/stuff?parameter1=value1¶meter2=%s¶meter3=%s", encodedData1, encodedData2); + + HttpUriRequest request = requestBuilder.build(); + Assert.assertEquals(uriExpected, request.getURI().toString()); + } + + private NameValuePair[] createParameters() { + NameValuePair parameters[] = new NameValuePair[3]; + parameters[0] = new BasicNameValuePair("parameter1", "value1"); + parameters[1] = new BasicNameValuePair("parameter2", "\"1ª position\""); + parameters[2] = new BasicNameValuePair("parameter3", "José Abraão"); + return parameters; + } +} From 778b2ae97eb19ab75119a19ea40c97acfea4e1a3 Mon Sep 17 00:00:00 2001 From: isabelabel Date: Tue, 27 May 2014 14:19:15 -0300 Subject: [PATCH 2/3] [URIBuilder] Create a charset attribute to allow to set any valid charset. Use it in all methods that were using 'Consts.UTF_8' --- .../apache/http/client/utils/URIBuilder.java | 22 +++++-- .../http/client/utils/TestURIBuilder.java | 62 ++++++++++++++++++- 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java b/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java index b7816ae8f8..bd25a7cf2e 100644 --- a/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java +++ b/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java @@ -59,6 +59,7 @@ public class URIBuilder { private String encodedQuery; private List queryParams; private String query; + private Charset charset = Consts.UTF_8; private String fragment; private String encodedFragment; @@ -90,6 +91,15 @@ public URIBuilder(final URI uri) { digestURI(uri); } + public URIBuilder setCharset(Charset charset) { + this.charset = charset; + return this; + } + + public Charset getCharset() { + return charset; + } + private List parseQuery(final String query, final Charset charset) { if (query != null && !query.isEmpty()) { return URLEncodedUtils.parse(query, charset); @@ -162,25 +172,25 @@ private void digestURI(final URI uri) { this.encodedPath = uri.getRawPath(); this.path = uri.getPath(); this.encodedQuery = uri.getRawQuery(); - this.queryParams = parseQuery(uri.getRawQuery(), Consts.UTF_8); + this.queryParams = parseQuery(uri.getRawQuery(), this.charset); this.encodedFragment = uri.getRawFragment(); this.fragment = uri.getFragment(); } private String encodeUserInfo(final String userInfo) { - return URLEncodedUtils.encUserInfo(userInfo, Consts.UTF_8); + return URLEncodedUtils.encUserInfo(userInfo, this.charset); } private String encodePath(final String path) { - return URLEncodedUtils.encPath(path, Consts.UTF_8); + return URLEncodedUtils.encPath(path, this.charset); } private String encodeUrlForm(final List params) { - return URLEncodedUtils.format(params, Consts.UTF_8); + return URLEncodedUtils.format(params, this.charset); } private String encodeUric(final String fragment) { - return URLEncodedUtils.encUric(fragment, Consts.UTF_8); + return URLEncodedUtils.encUric(fragment, this.charset); } /** @@ -263,7 +273,7 @@ public URIBuilder removeQuery() { */ @Deprecated public URIBuilder setQuery(final String query) { - this.queryParams = parseQuery(query, Consts.UTF_8); + this.queryParams = parseQuery(query, this.charset); this.query = null; this.encodedQuery = null; this.encodedSchemeSpecificPart = null; diff --git a/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java b/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java index 4d7bdfc06e..83835ae632 100644 --- a/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java +++ b/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java @@ -27,7 +27,14 @@ package org.apache.http.client.utils; import java.net.URI; - +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +import org.apache.http.Consts; +import org.apache.http.NameValuePair; +import org.apache.http.message.BasicNameValuePair; import org.junit.Assert; import org.junit.Test; @@ -232,4 +239,57 @@ public void testAgainstURIEncoded() throws Exception { } + @Test + public void testBuildAddParametersUTF8() throws Exception { + assertAddParameters(Consts.UTF_8); + } + + @Test + public void testBuildAddParametersISO88591() throws Exception { + assertAddParameters(Consts.ISO_8859_1); + } + + public void assertAddParameters(Charset charset) throws Exception { + final URI uri = new URIBuilder("https://somehost.com/stuff") + .setCharset(charset) + .addParameters(createParameters()).build(); + + assertBuild(charset, uri); + } + + @Test + public void testBuildSetParametersUTF8() throws Exception { + assertSetParameters(Consts.UTF_8); + } + + @Test + public void testBuildSetParametersISO88591() throws Exception { + assertSetParameters(Consts.ISO_8859_1); + } + + public void assertSetParameters(Charset charset) throws Exception { + final URI uri = new URIBuilder("https://somehost.com/stuff") + .setCharset(charset) + .setParameters(createParameters()).build(); + + assertBuild(charset, uri); + } + + public void assertBuild(Charset charset, URI uri) throws Exception { + String encodedData1 = URLEncoder.encode("\"1ª position\"", charset.displayName()); + String encodedData2 = URLEncoder.encode("José Abraão", charset.displayName()); + + String uriExpected = String.format("https://somehost.com/stuff?parameter1=value1¶meter2=%s¶meter3=%s", encodedData1, encodedData2); + + Assert.assertEquals(uriExpected, uri.toString()); + } + + private List createParameters() { + List parameters = new ArrayList(); + parameters.add(new BasicNameValuePair("parameter1", "value1")); + parameters.add(new BasicNameValuePair("parameter2", "\"1ª position\"")); + parameters.add(new BasicNameValuePair("parameter3", "José Abraão")); + return parameters; + } + } From 473895a5db6416f396bb5002b5cfa2c3fa785e8a Mon Sep 17 00:00:00 2001 From: bel Date: Tue, 3 Jun 2014 17:42:47 -0300 Subject: [PATCH 3/3] Fix code style --- .../http/client/methods/RequestBuilder.java | 14 ++- .../apache/http/client/utils/URIBuilder.java | 14 ++- .../http/client/utils/TestRequestBuilder.java | 88 ++++++++++++------- .../http/client/utils/TestURIBuilder.java | 50 +++++------ 4 files changed, 102 insertions(+), 64 deletions(-) diff --git a/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java b/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java index 8981a604c7..c2edeeec00 100644 --- a/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java +++ b/httpclient/src/main/java/org/apache/http/client/methods/RequestBuilder.java @@ -300,13 +300,19 @@ private RequestBuilder doCopy(final HttpRequest request) { return this; } - public RequestBuilder setCharset(Charset charset) { - this.charset = charset; - return this; + /** + * @since 4.4 + */ + public RequestBuilder setCharset(final Charset charset) { + this.charset = charset; + return this; } + /** + * @since 4.4 + */ public Charset getCharset() { - return charset; + return charset; } public String getMethod() { diff --git a/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java b/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java index bd25a7cf2e..6f68163b00 100644 --- a/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java +++ b/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java @@ -91,13 +91,19 @@ public URIBuilder(final URI uri) { digestURI(uri); } - public URIBuilder setCharset(Charset charset) { - this.charset = charset; - return this; + /** + * @since 4.4 + */ + public URIBuilder setCharset(final Charset charset) { + this.charset = charset; + return this; } + /** + * @since 4.4 + */ public Charset getCharset() { - return charset; + return charset; } private List parseQuery(final String query, final Charset charset) { diff --git a/httpclient/src/test/java/org/apache/http/client/utils/TestRequestBuilder.java b/httpclient/src/test/java/org/apache/http/client/utils/TestRequestBuilder.java index b27d9b1541..d71c018b38 100644 --- a/httpclient/src/test/java/org/apache/http/client/utils/TestRequestBuilder.java +++ b/httpclient/src/test/java/org/apache/http/client/utils/TestRequestBuilder.java @@ -1,3 +1,29 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ package org.apache.http.client.utils; @@ -14,35 +40,35 @@ public class TestRequestBuilder { - @Test - public void testBuildGETwithUTF8() throws Exception { - assertBuild(Consts.UTF_8); - } - - @Test - public void testBuildGETwithISO88591() throws Exception { - assertBuild(Consts.ISO_8859_1); - } - - private void assertBuild(Charset charset) throws Exception { - RequestBuilder requestBuilder = RequestBuilder.create("GET").setCharset(charset); - requestBuilder.setUri("https://somehost.com/stuff"); - requestBuilder.addParameters(createParameters()); - - String encodedData1 = URLEncoder.encode("\"1ª position\"", charset.displayName()); - String encodedData2 = URLEncoder.encode("José Abraão", charset.displayName()); - - String uriExpected = String.format("https://somehost.com/stuff?parameter1=value1¶meter2=%s¶meter3=%s", encodedData1, encodedData2); - - HttpUriRequest request = requestBuilder.build(); - Assert.assertEquals(uriExpected, request.getURI().toString()); - } - - private NameValuePair[] createParameters() { - NameValuePair parameters[] = new NameValuePair[3]; - parameters[0] = new BasicNameValuePair("parameter1", "value1"); - parameters[1] = new BasicNameValuePair("parameter2", "\"1ª position\""); - parameters[2] = new BasicNameValuePair("parameter3", "José Abraão"); - return parameters; - } + @Test + public void testBuildGETwithUTF8() throws Exception { + assertBuild(Consts.UTF_8); + } + + @Test + public void testBuildGETwithISO88591() throws Exception { + assertBuild(Consts.ISO_8859_1); + } + + private void assertBuild(final Charset charset) throws Exception { + final RequestBuilder requestBuilder = RequestBuilder.create("GET").setCharset(charset); + requestBuilder.setUri("https://somehost.com/stuff"); + requestBuilder.addParameters(createParameters()); + + final String encodedData1 = URLEncoder.encode("\"1\u00aa position\"", charset.displayName()); + final String encodedData2 = URLEncoder.encode("Jos\u00e9 Abra\u00e3o", charset.displayName()); + + final String uriExpected = String.format("https://somehost.com/stuff?parameter1=value1¶meter2=%s¶meter3=%s", encodedData1, encodedData2); + + final HttpUriRequest request = requestBuilder.build(); + Assert.assertEquals(uriExpected, request.getURI().toString()); + } + + private NameValuePair[] createParameters() { + final NameValuePair parameters[] = new NameValuePair[3]; + parameters[0] = new BasicNameValuePair("parameter1", "value1"); + parameters[1] = new BasicNameValuePair("parameter2", "\"1\u00aa position\""); + parameters[2] = new BasicNameValuePair("parameter3", "Jos\u00e9 Abra\u00e3o"); + return parameters; + } } diff --git a/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java b/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java index 83835ae632..6ed9d7af96 100644 --- a/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java +++ b/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java @@ -241,55 +241,55 @@ public void testAgainstURIEncoded() throws Exception { @Test public void testBuildAddParametersUTF8() throws Exception { - assertAddParameters(Consts.UTF_8); + assertAddParameters(Consts.UTF_8); } @Test public void testBuildAddParametersISO88591() throws Exception { - assertAddParameters(Consts.ISO_8859_1); + assertAddParameters(Consts.ISO_8859_1); } - public void assertAddParameters(Charset charset) throws Exception { - final URI uri = new URIBuilder("https://somehost.com/stuff") - .setCharset(charset) - .addParameters(createParameters()).build(); + public void assertAddParameters(final Charset charset) throws Exception { + final URI uri = new URIBuilder("https://somehost.com/stuff") + .setCharset(charset) + .addParameters(createParameters()).build(); - assertBuild(charset, uri); + assertBuild(charset, uri); } @Test public void testBuildSetParametersUTF8() throws Exception { - assertSetParameters(Consts.UTF_8); + assertSetParameters(Consts.UTF_8); } @Test public void testBuildSetParametersISO88591() throws Exception { - assertSetParameters(Consts.ISO_8859_1); + assertSetParameters(Consts.ISO_8859_1); } - public void assertSetParameters(Charset charset) throws Exception { - final URI uri = new URIBuilder("https://somehost.com/stuff") - .setCharset(charset) - .setParameters(createParameters()).build(); + public void assertSetParameters(final Charset charset) throws Exception { + final URI uri = new URIBuilder("https://somehost.com/stuff") + .setCharset(charset) + .setParameters(createParameters()).build(); - assertBuild(charset, uri); + assertBuild(charset, uri); } - public void assertBuild(Charset charset, URI uri) throws Exception { - String encodedData1 = URLEncoder.encode("\"1ª position\"", charset.displayName()); - String encodedData2 = URLEncoder.encode("José Abraão", charset.displayName()); + public void assertBuild(final Charset charset, final URI uri) throws Exception { + final String encodedData1 = URLEncoder.encode("\"1\u00aa position\"", charset.displayName()); + final String encodedData2 = URLEncoder.encode("Jos\u00e9 Abra\u00e3o", charset.displayName()); - String uriExpected = String.format("https://somehost.com/stuff?parameter1=value1¶meter2=%s¶meter3=%s", encodedData1, encodedData2); - - Assert.assertEquals(uriExpected, uri.toString()); + final String uriExpected = String.format("https://somehost.com/stuff?parameter1=value1¶meter2=%s¶meter3=%s", encodedData1, encodedData2); + + Assert.assertEquals(uriExpected, uri.toString()); } private List createParameters() { - List parameters = new ArrayList(); - parameters.add(new BasicNameValuePair("parameter1", "value1")); - parameters.add(new BasicNameValuePair("parameter2", "\"1ª position\"")); - parameters.add(new BasicNameValuePair("parameter3", "José Abraão")); - return parameters; + final List parameters = new ArrayList(); + parameters.add(new BasicNameValuePair("parameter1", "value1")); + parameters.add(new BasicNameValuePair("parameter2", "\"1\u00aa position\"")); + parameters.add(new BasicNameValuePair("parameter3", "Jos\u00e9 Abra\u00e3o")); + return parameters; } }