Properly escape delimiters in path in UrlBuilder
Specifically %-encode ? and # passed to setPath so they're not confused
with the start of the query-string or hash.
Bug: issue 8885
Change-Id: I599e4b8e4506d704a5b8867b1c1551b735f3ce50
diff --git a/user/src/com/google/gwt/http/client/UrlBuilder.java b/user/src/com/google/gwt/http/client/UrlBuilder.java
index bd2b047..9c48468 100644
--- a/user/src/com/google/gwt/http/client/UrlBuilder.java
+++ b/user/src/com/google/gwt/http/client/UrlBuilder.java
@@ -64,7 +64,7 @@
// http://www.google.com:80/path/to/file.html
if (path != null && !"".equals(path)) {
- url.append("/").append(URL.encode(path));
+ url.append("/").append(URL.encode(path).replace("?", "%3F").replace("#", "%23"));
}
// Generate the query string.
diff --git a/user/test/com/google/gwt/http/client/UrlBuilderTest.java b/user/test/com/google/gwt/http/client/UrlBuilderTest.java
index 6733de6..67fb123 100644
--- a/user/test/com/google/gwt/http/client/UrlBuilderTest.java
+++ b/user/test/com/google/gwt/http/client/UrlBuilderTest.java
@@ -43,6 +43,16 @@
builder = new UrlBuilder();
builder.setHost("google.com");
+ builder.setPath("?not-query#not-hash");
+ builder.setParameter("not=value¬-next", "¬-next=pair");
+ builder.setParameter("#not-hash", "#not-hash");
+ builder.setHash("hash#in-hash");
+ assertEquals(
+ "http://google.com/%3Fnot-query%23not-hash?not%3Dvalue%26not-next=%26not-next%3Dpair&%23not-hash=%23not-hash#hash%23in-hash",
+ builder.buildString());
+
+ builder = new UrlBuilder();
+ builder.setHost("google.com");
builder.setPath("path");
builder.setHash("hash");