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 2019/01/12 16:22:07 UTC
[httpcomponents-client] 01/01: HTTPCLIENT-1960: URIBuilder
incorrect handling of multiple leading slashes in path component
This is an automated email from the ASF dual-hosted git repository.
olegk pushed a commit to branch HTTPCLIENT-1960
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git
commit 8c04c6ae5e5ba1432e40684428338ce68431766b
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Sat Jan 12 17:02:13 2019 +0100
HTTPCLIENT-1960: URIBuilder incorrect handling of multiple leading slashes in path component
---
.../org/apache/http/client/utils/URIBuilder.java | 9 ---------
.../java/org/apache/http/client/utils/URIUtils.java | 14 +++++++++++++-
.../org/apache/http/client/utils/TestURIBuilder.java | 20 ++++++++++++++++++++
.../org/apache/http/client/utils/TestURIUtils.java | 4 ++--
4 files changed, 35 insertions(+), 12 deletions(-)
diff --git a/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java b/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java
index 35c74de..322ee23 100644
--- a/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java
+++ b/httpclient/src/main/java/org/apache/http/client/utils/URIBuilder.java
@@ -171,15 +171,6 @@ public class URIBuilder {
if (TextUtils.isBlank(s)) {
return "";
}
- int n = 0;
- for (; n < s.length(); n++) {
- if (s.charAt(n) != '/') {
- break;
- }
- }
- if (n > 1) {
- s = s.substring(n - 1);
- }
if (!relative && !s.startsWith("/")) {
s = "/" + s;
}
diff --git a/httpclient/src/main/java/org/apache/http/client/utils/URIUtils.java b/httpclient/src/main/java/org/apache/http/client/utils/URIUtils.java
index 7bb01c6..b06a952 100644
--- a/httpclient/src/main/java/org/apache/http/client/utils/URIUtils.java
+++ b/httpclient/src/main/java/org/apache/http/client/utils/URIUtils.java
@@ -147,8 +147,20 @@ public class URIUtils {
if (dropFragment) {
uribuilder.setFragment(null);
}
- if (TextUtils.isEmpty(uribuilder.getPath())) {
+ final String path = uribuilder.getPath();
+ if (TextUtils.isEmpty(path)) {
uribuilder.setPath("/");
+ } else {
+ final StringBuilder buf = new StringBuilder(path.length());
+ boolean foundSlash = false;
+ for (int i = 0; i < path.length(); i++) {
+ final char ch = path.charAt(i);
+ if (ch != '/' || !foundSlash) {
+ buf.append(ch);
+ }
+ foundSlash = ch == '/';
+ }
+ uribuilder.setPath(buf.toString());
}
return uribuilder.build();
}
diff --git a/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java b/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java
index f96178b..d9bdaa3 100644
--- a/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java
+++ b/httpclient/src/test/java/org/apache/http/client/utils/TestURIBuilder.java
@@ -36,6 +36,7 @@ import java.util.List;
import org.apache.http.Consts;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
+import org.hamcrest.CoreMatchers;
import org.junit.Assert;
import org.junit.Test;
@@ -328,4 +329,23 @@ public class TestURIBuilder {
Assert.assertEquals(new URI("http://somehost/./mypath"), uri);
}
+ @Test
+ public void testMultipleLeadingPathSlashes() throws Exception {
+ final URI uri = new URIBuilder()
+ .setScheme("ftp")
+ .setHost("somehost")
+ .setPath("//blah//blah")
+ .build();
+ Assert.assertThat(uri, CoreMatchers.equalTo(URI.create("ftp://somehost//blah//blah")));
+ }
+
+ @Test
+ public void testPathNoLeadingSlash() throws Exception {
+ final URI uri = new URIBuilder()
+ .setScheme("ftp")
+ .setPath("blah")
+ .build();
+ Assert.assertThat(uri, CoreMatchers.equalTo(URI.create("ftp:/blah")));
+ }
+
}
diff --git a/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java b/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java
index e33477f..035fad4 100644
--- a/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java
+++ b/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java
@@ -51,8 +51,8 @@ public class TestURIUtils {
URI.create("http://thishost/stuff"), null).toString());
Assert.assertEquals("/", URIUtils.rewriteURI(
URI.create("http://thishost//"), null).toString());
- Assert.assertEquals("/stuff///morestuff", URIUtils.rewriteURI(
- URI.create("http://thishost//stuff///morestuff"), null).toString());
+ Assert.assertEquals("/stuff/morestuff", URIUtils.rewriteURI(
+ URI.create("http://thishost//stuff/morestuff"), null).toString());
Assert.assertEquals("http://thathost/stuff", URIUtils.rewriteURI(
URI.create("http://thishost/stuff#crap"), target, true).toString());
Assert.assertEquals("http://thathost/stuff#crap", URIUtils.rewriteURI(