diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestSupport.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestSupport.java index 5a8cde1ffb..9beb5f0054 100644 --- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestSupport.java +++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestSupport.java @@ -113,7 +113,8 @@ public static String extractPathPrefix(final HttpRequest request) { requiresOptimization = true; } } - if (ch == '.' || ch != '/' && !UNRESERVED.get(ch)) { + // Only a dot at the start of a segment can begin a dot segment + if (ch == '.' && previous == '/' || ch != '/' && !UNRESERVED.get(ch)) { requiresOptimization = true; } previous = ch; diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/TestRequestSupport.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/TestRequestSupport.java index eb840fab77..e3912f4d87 100644 --- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/TestRequestSupport.java +++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/TestRequestSupport.java @@ -55,4 +55,18 @@ void testPathPrefixExtraction() { Assertions.assertEquals("/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", ""))); } + @Test + void testPathPrefixExtractionDots() { + Assertions.assertEquals("/aaaa/b.b/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "/aaaa/b.b/cccc"))); + Assertions.assertEquals("/aaaa/bbbb/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "/aaaa/bbbb/cc.cc"))); + Assertions.assertEquals("/a.a/b..b/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "/a.a/b..b/c."))); + Assertions.assertEquals("/aaaa/.bbbb/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "/aaaa/.bbbb/cccc"))); + Assertions.assertEquals("/aaaa/.../", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "/aaaa/.../cccc"))); + Assertions.assertEquals("/aaaa/bbbb/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "/aaaa/./bbbb/cccc"))); + Assertions.assertEquals("/aaaa/bbbb/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "/aaaa/bbbb/."))); + Assertions.assertEquals("/cccc/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "/aaaa/%2E%2E/cccc/dddd"))); + Assertions.assertEquals("/aaaa/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "../aaaa/bbbb"))); + Assertions.assertEquals("/foo.bar/", RequestSupport.extractPathPrefix(new BasicHttpRequest("GET", "foo.bar/baz"))); + } + }