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/04/18 13:49:33 UTC

[httpcomponents-core] branch HTTPCORE-628 created (now 344b79f)

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a change to branch HTTPCORE-628
in repository https://gitbox.apache.org/repos/asf/httpcomponents-core.git.


      at 344b79f  HTTPCORE-628: do not encode blanks as + in URI query component

This branch includes the following new commits:

     new 344b79f  HTTPCORE-628: do not encode blanks as + in URI query component

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[httpcomponents-core] 01/01: HTTPCORE-628: do not encode blanks as + in URI query component

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch HTTPCORE-628
in repository https://gitbox.apache.org/repos/asf/httpcomponents-core.git

commit 344b79f858f11064ca859faad09751b3610ba631
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&param=1+%2B+1+%3D+2&" +
+        Assert.assertEquals(new URI("http://localhost:80/?param=stuff&param=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&parameter2=%s&parameter3=%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) {