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 39d689be6724..f814955fe2b3 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 @@ -85,7 +85,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { private static final String HOST_PATTERN = "(" + HOST_IPV6_PATTERN + "|" + HOST_IPV4_PATTERN + ")"; - private static final String PORT_PATTERN = "([^/?#]*)"; + private static final String PORT_PATTERN = "(\\{[^}]+}?|[^/?#]*)"; private static final String PATH_PATTERN = "([^?#]*)"; 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 2da0fc9b2857..3b8a5168cfb2 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 @@ -1297,4 +1297,14 @@ void verifyInvalidPort() { .isInstanceOf(NumberFormatException.class); } + @Test // gh-27039 + void expandPortAndPathWithoutSeparator() { + URI uri = UriComponentsBuilder + .fromUriString("ws://localhost:{port}{path}") + .buildAndExpand(7777, "/test") + .toUri(); + assertThat(uri.toString()).isEqualTo("ws://localhost:7777/test"); + } + + }