From 0468ef46ac33e33a6791ae9d05788c07548f0453 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Mon, 10 May 2021 07:18:50 +0100 Subject: [PATCH] Follow-up fix for recent change to PORT_PATTERN The pattern was changed in 65797d04f2b7e3469102aacc18ec642f7183a645 to check for characters up until "/", instead of for digits, but now also checks up until "?" and "#". Closes gh-26905 --- .../web/util/UriComponentsBuilder.java | 2 +- .../web/util/UriComponentsBuilderTests.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) 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() {