diff --git a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java index 2a018815b1c..8142936b1b4 100644 --- a/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java @@ -720,7 +720,14 @@ public class UriComponentsBuilder { if (this.path.length() == 0) { return null; } - String path = this.path.toString().replace("//", "/"); + String path = this.path.toString(); + while (true) { + int index = path.indexOf("//"); + if (index == -1) { + break; + } + path = path.substring(0, index) + path.substring(index + 1); + } return new HierarchicalUriComponents.FullPathComponent(path); } diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java index e116ddb21f9..d8f7f4d34dc 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java @@ -291,6 +291,14 @@ public class UriComponentsBuilderTests { assertEquals(Arrays.asList("foo", "bar"), result.getPathSegments()); } + // SPR-12398 + + @Test + public void pathWithDuplicateSlashes() throws URISyntaxException { + UriComponents uriComponents = UriComponentsBuilder.fromPath("/foo/////////bar").build(); + assertEquals("/foo/bar", uriComponents.getPath()); + } + @Test public void replacePath() { UriComponentsBuilder builder = UriComponentsBuilder.fromUriString("http://www.ietf.org/rfc/rfc2396.txt");