diff --git a/client/src/main/java/org/asynchttpclient/util/UriEncoder.java b/client/src/main/java/org/asynchttpclient/util/UriEncoder.java index d205aed6f..d94d0770b 100644 --- a/client/src/main/java/org/asynchttpclient/util/UriEncoder.java +++ b/client/src/main/java/org/asynchttpclient/util/UriEncoder.java @@ -62,9 +62,7 @@ protected String withQueryWithParams(final String query, final List query @Override protected String withQueryWithoutParams(final String query) { // encode query - StringBuilder sb = StringBuilderPool.DEFAULT.stringBuilder(); - encodeAndAppendQuery(sb, query); - return sb.toString(); + return Utf8UrlEncoder.encodeQuery(query); } @Override diff --git a/client/src/main/java/org/asynchttpclient/util/Utf8UrlEncoder.java b/client/src/main/java/org/asynchttpclient/util/Utf8UrlEncoder.java index fe01e3208..7cd9d250c 100644 --- a/client/src/main/java/org/asynchttpclient/util/Utf8UrlEncoder.java +++ b/client/src/main/java/org/asynchttpclient/util/Utf8UrlEncoder.java @@ -129,6 +129,11 @@ public static String encodePath(String input) { return sb == null ? input : sb.toString(); } + static String encodeQuery(String input) { + StringBuilder sb = lazyAppendEncoded(null, input, BUILT_QUERY_UNTOUCHED_CHARS, false); + return sb == null ? input : sb.toString(); + } + public static StringBuilder encodeAndAppendQuery(StringBuilder sb, String query) { return appendEncoded(sb, query, BUILT_QUERY_UNTOUCHED_CHARS, false); } diff --git a/client/src/test/java/org/asynchttpclient/util/Utf8UrlEncoderTest.java b/client/src/test/java/org/asynchttpclient/util/Utf8UrlEncoderTest.java index ee3966cf0..d5b5fa6ef 100644 --- a/client/src/test/java/org/asynchttpclient/util/Utf8UrlEncoderTest.java +++ b/client/src/test/java/org/asynchttpclient/util/Utf8UrlEncoderTest.java @@ -18,6 +18,8 @@ import io.github.artsok.RepeatedIfExceptionsTest; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertSame; public class Utf8UrlEncoderTest { @@ -28,6 +30,22 @@ public void testBasics() { assertEquals("a%2Bb", Utf8UrlEncoder.encodeQueryElement("a+b")); } + @RepeatedIfExceptionsTest(repeats = 5) + public void encodeQueryReusesInputWhenNothingNeedsEscaping() { + String query = "a=1&b=/two?c%20d"; + + assertSame(query, Utf8UrlEncoder.encodeQuery(query)); + } + + @RepeatedIfExceptionsTest(repeats = 5) + public void encodeQueryEscapesWhenNeeded() { + String query = "a=one two"; + String encoded = Utf8UrlEncoder.encodeQuery(query); + + assertNotSame(query, encoded); + assertEquals("a=one%20two", encoded); + } + @RepeatedIfExceptionsTest(repeats = 5) public void testPercentageEncoding() { assertEquals("foobar", Utf8UrlEncoder.percentEncodeQueryElement("foobar"));