From 597c279dfe51daf30457da85cc033feb34325286 Mon Sep 17 00:00:00 2001 From: Isaac Green Date: Wed, 9 Sep 2015 08:47:09 -0400 Subject: [PATCH] only encode URI problem chars when actually converting to URI --- .../src/test/java/com/squareup/okhttp/HttpUrlTest.java | 6 ++++++ okhttp/src/main/java/com/squareup/okhttp/HttpUrl.java | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/okhttp-tests/src/test/java/com/squareup/okhttp/HttpUrlTest.java b/okhttp-tests/src/test/java/com/squareup/okhttp/HttpUrlTest.java index 66288a198..9ef2004ca 100644 --- a/okhttp-tests/src/test/java/com/squareup/okhttp/HttpUrlTest.java +++ b/okhttp-tests/src/test/java/com/squareup/okhttp/HttpUrlTest.java @@ -914,6 +914,12 @@ public final class HttpUrlTest { assertEquals("http://username:password@host/path?query#fragment", uri.toString()); } + @Test public void toUriSpecialQueryCharacters() throws Exception { + HttpUrl httpUrl = HttpUrl.parse("http://host/?d=abc!@[]^`{}|\\"); + URI uri = httpUrl.uri(); + assertEquals("http://host/?d=abc!@[]%5E%60%7B%7D%7C%5C", uri.toString()); + } + @Test public void toUriForbiddenCharacter() throws Exception { HttpUrl httpUrl = HttpUrl.parse("http://host/a[b"); try { diff --git a/okhttp/src/main/java/com/squareup/okhttp/HttpUrl.java b/okhttp/src/main/java/com/squareup/okhttp/HttpUrl.java index 65955c33a..fd1caca7a 100644 --- a/okhttp/src/main/java/com/squareup/okhttp/HttpUrl.java +++ b/okhttp/src/main/java/com/squareup/okhttp/HttpUrl.java @@ -259,7 +259,8 @@ public final class HttpUrl { static final String PASSWORD_ENCODE_SET = " \"':;<=>@[]^`{}|/\\?#"; static final String PATH_SEGMENT_ENCODE_SET = " \"<>^`{}|/\\?#"; static final String QUERY_ENCODE_SET = " \"'<>#"; - static final String QUERY_COMPONENT_ENCODE_SET = " \"'<>#&=^`{}|\\"; + static final String QUERY_COMPONENT_ENCODE_SET = " \"'<>#&="; + static final String CONVERT_TO_URI_ENCODE_SET = "^`{}|\\"; static final String FORM_ENCODE_SET = " \"':;<=>@[]^`{}|/\\?#&!$(),~"; static final String FRAGMENT_ENCODE_SET = ""; @@ -331,7 +332,8 @@ public final class HttpUrl { */ public URI uri() { try { - return new URI(url); + String uriSafeUrl = canonicalize(url, CONVERT_TO_URI_ENCODE_SET, true, false); + return new URI(uriSafeUrl); } catch (URISyntaxException e) { throw new IllegalStateException("not valid as a java.net.URI: " + url); }