You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2020/09/12 12:38:58 UTC
[httpcomponents-core] 05/18: HTTPCORE-628: do not encode blanks as
+ in URI query component
This is an automated email from the ASF dual-hosted git repository.
olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-core.git
commit c5903208a32bb6fa0f0c580072b7ea1393e1cf46
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Sat Apr 18 15:43:10 2020 +0200
HTTPCORE-628: do not encode blanks as + in URI query component
---
.../org/apache/hc/core5/net/URLEncodedUtils.java | 22 +++++++++++++--------
.../org/apache/hc/core5/net/TestURIBuilder.java | 23 +++++++++++++++-------
.../apache/hc/core5/net/TestURLEncodedUtils.java | 12 +++++------
3 files changed, 36 insertions(+), 21 deletions(-)
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/net/URLEncodedUtils.java b/httpcore5/src/main/java/org/apache/hc/core5/net/URLEncodedUtils.java
index f9c999c..93376be 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/net/URLEncodedUtils.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/net/URLEncodedUtils.java
@@ -206,7 +206,7 @@ public class URLEncodedUtils {
static void formatSegments(final StringBuilder buf, final Iterable<String> segments, final Charset charset) {
for (final String segment : segments) {
buf.append(PATH_SEPARATOR);
- urlEncode(buf, segment, charset, PATHSAFE, false);
+ urlEncode(buf, segment, charset, PATHSAFE);
}
}
@@ -419,8 +419,7 @@ public class URLEncodedUtils {
final StringBuilder buf,
final String content,
final Charset charset,
- final BitSet safechars,
- final boolean blankAsPlus) {
+ final BitSet safechars) {
if (content == null) {
return;
}
@@ -429,8 +428,6 @@ public class URLEncodedUtils {
final int b = bb.get() & 0xff;
if (safechars.get(b)) {
buf.append((char) b);
- } else if (blankAsPlus && b == ' ') {
- buf.append('+');
} else {
buf.append("%");
final char hex1 = Character.toUpperCase(Character.forDigit((b >> 4) & 0xF, RADIX));
@@ -485,15 +482,24 @@ public class URLEncodedUtils {
if (content == null) {
return;
}
- urlEncode(buf, content, charset != null ? charset : StandardCharsets.UTF_8, URLENCODER, true);
+ urlEncode(buf, content, charset != null ? charset : StandardCharsets.UTF_8, URLENCODER);
+ }
+
+ static String encodeFormFields(final String content, final Charset charset) {
+ if (content == null) {
+ return null;
+ }
+ final StringBuilder buf = new StringBuilder();
+ urlEncode(buf, content, charset != null ? charset : StandardCharsets.UTF_8, URLENCODER);
+ return buf.toString();
}
static void encUserInfo(final StringBuilder buf, final String content, final Charset charset) {
- urlEncode(buf, content, charset != null ? charset : StandardCharsets.UTF_8, USERINFO, false);
+ urlEncode(buf, content, charset != null ? charset : StandardCharsets.UTF_8, USERINFO);
}
static void encUric(final StringBuilder buf, final String content, final Charset charset) {
- urlEncode(buf, content, charset != null ? charset : StandardCharsets.UTF_8, URIC, false);
+ urlEncode(buf, content, charset != null ? charset : StandardCharsets.UTF_8, URIC);
}
}
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java b/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java
index aeabdcb..cf68126 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java
@@ -28,7 +28,6 @@ package org.apache.hc.core5.net;
import java.net.InetAddress;
import java.net.URI;
-import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
@@ -191,7 +190,7 @@ public class TestURIBuilder {
final URIBuilder uribuilder = new URIBuilder(uri).setParameter("param", "some other stuff")
.setParameter("blah", "blah");
final URI result = uribuilder.build();
- Assert.assertEquals(new URI("http://localhost:80/?param=some+other+stuff&blah=blah"), result);
+ Assert.assertEquals(new URI("http://localhost:80/?param=some%20other%20stuff&blah=blah"), result);
}
@Test
@@ -216,7 +215,7 @@ public class TestURIBuilder {
final URIBuilder uribuilder = new URIBuilder(uri).addParameter("param", "1 + 1 = 2")
.addParameter("param", "blah&blah");
final URI result = uribuilder.build();
- Assert.assertEquals(new URI("http://localhost:80/?param=stuff¶m=1+%2B+1+%3D+2&" +
+ Assert.assertEquals(new URI("http://localhost:80/?param=stuff¶m=1%20%2B%201%20%3D%202&" +
"param=blah%26blah"), result);
}
@@ -227,13 +226,13 @@ public class TestURIBuilder {
.addParameter("blah", "blah");
final URI result = uribuilder.build();
Assert.assertEquals(new URI("http://localhost:80/?param=stuff&blah&blah&" +
- "param=some+other+stuff&blah=blah"), result);
+ "param=some%20other%20stuff&blah=blah"), result);
}
@Test
public void testQueryEncoding() throws Exception {
final URI uri1 = new URI("https://somehost.com/stuff?client_id=1234567890" +
- "&redirect_uri=https%3A%2F%2Fsomehost.com%2Fblah+blah%2F");
+ "&redirect_uri=https%3A%2F%2Fsomehost.com%2Fblah%20blah%2F");
final URI uri2 = new URIBuilder("https://somehost.com/stuff")
.addParameter("client_id","1234567890")
.addParameter("redirect_uri","https://somehost.com/blah blah/").build();
@@ -356,8 +355,8 @@ public class TestURIBuilder {
}
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());
+ final String encodedData1 = URLEncodedUtils.encodeFormFields("\"1\u00aa position\"", charset);
+ final String encodedData2 = URLEncodedUtils.encodeFormFields("Jos\u00e9 Abra\u00e3o", charset);
final String uriExpected = String.format("https://somehost.com/stuff?parameter1=value1¶meter2=%s¶meter3=%s", encodedData1, encodedData2);
@@ -455,4 +454,14 @@ public class TestURIBuilder {
Assert.assertThat(uriBuilder.isOpaque(), CoreMatchers.equalTo(uri.isOpaque()));
}
+ @Test
+ public void testAddParameterEncodingEquivalence() throws Exception {
+ final URI uri = new URI("http", null, "localhost", 80, "/",
+ "param=stuff with spaces", null);
+ final URIBuilder uribuilder = new URIBuilder().setScheme("http").setHost("localhost").setPort(80).setPath("/").addParameter(
+ "param", "stuff with spaces");
+ final URI result = uribuilder.build();
+ Assert.assertEquals(uri, result);
+ }
+
}
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/net/TestURLEncodedUtils.java b/httpcore5/src/test/java/org/apache/hc/core5/net/TestURLEncodedUtils.java
index 047cda3..e7687a4 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/net/TestURLEncodedUtils.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/net/TestURLEncodedUtils.java
@@ -302,7 +302,7 @@ public class TestURLEncodedUtils {
params.clear();
params.add(new BasicNameValuePair("Name4", "Value 4&"));
- Assert.assertEquals("Name4=Value+4%26", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
+ Assert.assertEquals("Name4=Value%204%26", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name4", "Value+4&"));
@@ -310,7 +310,7 @@ public class TestURLEncodedUtils {
params.clear();
params.add(new BasicNameValuePair("Name4", "Value 4& =4"));
- Assert.assertEquals("Name4=Value+4%26+%3D4", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
+ Assert.assertEquals("Name4=Value%204%26%20%3D4", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name5", "aaa"));
@@ -327,7 +327,7 @@ public class TestURLEncodedUtils {
params.clear();
params.add(new BasicNameValuePair("Name8", "xx, yy ,zz"));
- Assert.assertEquals("Name8=xx%2C++yy++%2Czz", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
+ Assert.assertEquals("Name8=xx%2C%20%20yy%20%20%2Czz", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
}
@Test
@@ -349,7 +349,7 @@ public class TestURLEncodedUtils {
params.clear();
params.add(new BasicNameValuePair("Name4", "Value 4&"));
- Assert.assertEquals("Name4=Value+4%26", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
+ Assert.assertEquals("Name4=Value%204%26", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name4", "Value+4&"));
@@ -357,7 +357,7 @@ public class TestURLEncodedUtils {
params.clear();
params.add(new BasicNameValuePair("Name4", "Value 4& =4"));
- Assert.assertEquals("Name4=Value+4%26+%3D4", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
+ Assert.assertEquals("Name4=Value%204%26%20%3D4", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name5", "aaa"));
@@ -372,7 +372,7 @@ public class TestURLEncodedUtils {
params.clear();
params.add(new BasicNameValuePair("Name8", "xx, yy ,zz"));
- Assert.assertEquals("Name8=xx%2C++yy++%2Czz", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
+ Assert.assertEquals("Name8=xx%2C%20%20yy%20%20%2Czz", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
}
private List <NameValuePair> parse (final String params) {