diff --git a/httpcore5/src/main/java/org/apache/hc/core5/net/URIBuilder.java b/httpcore5/src/main/java/org/apache/hc/core5/net/URIBuilder.java index f5ca7afaa..218f300a5 100644 --- a/httpcore5/src/main/java/org/apache/hc/core5/net/URIBuilder.java +++ b/httpcore5/src/main/java/org/apache/hc/core5/net/URIBuilder.java @@ -1163,7 +1163,7 @@ static List optimizePathSegments(final List inputSegments) { } if (!inputSegments.isEmpty()) { final String lastSegment = inputSegments.get(inputSegments.size() - 1); - if (lastSegment.isEmpty()) { + if (lastSegment.isEmpty() || lastSegment.equals("..") || lastSegment.equals(".")) { outputSegments.addLast(""); } } diff --git a/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java b/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java index 42d0f00e2..fcef8d125 100644 --- a/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java +++ b/httpcore5/src/test/java/org/apache/hc/core5/net/TestURIBuilder.java @@ -877,6 +877,12 @@ void testOptimize() throws Exception { new URIBuilder("file:../../.././").optimize().build().toASCIIString()); Assertions.assertEquals("http://host/", new URIBuilder("http://host/../../.././").optimize().build().toASCIIString()); + Assertions.assertEquals("http://host/a/", + new URIBuilder("http://host/a/b/..").optimize().build().toASCIIString()); + Assertions.assertEquals("http://host/a/b/", + new URIBuilder("http://host/a/b/.").optimize().build().toASCIIString()); + Assertions.assertEquals("http://host/a/b/..../...", + new URIBuilder("http://host/a/b/..../...").optimize().build().toASCIIString()); Assertions.assertThrows(URISyntaxException.class, () -> new URIBuilder("http:///../../.././").optimize().build().toASCIIString()); }