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 f5009604064..7779aff4afe 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 12813bd80bd..2da0fc9b285 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 @@ -1273,6 +1273,20 @@ class UriComponentsBuilderTests { assertThat(path).isEqualTo("/home/path"); } + @Test + void validPort() { + UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://localhost:52567/path").build(); + assertThat(uriComponents.getPort()).isEqualTo(52567); + assertThat(uriComponents.getPath()).isEqualTo("/path"); + + uriComponents = UriComponentsBuilder.fromUriString("http://localhost:52567?trace=false").build(); + assertThat(uriComponents.getPort()).isEqualTo(52567); + assertThat(uriComponents.getQuery()).isEqualTo("trace=false"); + + uriComponents = UriComponentsBuilder.fromUriString("http://localhost:52567#fragment").build(); + assertThat(uriComponents.getPort()).isEqualTo(52567); + assertThat(uriComponents.getFragment()).isEqualTo("fragment"); + } @Test void verifyInvalidPort() {