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 be865004ad..f5c8163713 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 @@ -236,13 +236,16 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { } builder.scheme(scheme); if (opaque) { - String ssp = uri.substring(scheme.length()).substring(1); + String ssp = uri.substring(scheme.length() + 1); if (StringUtils.hasLength(fragment)) { ssp = ssp.substring(0, ssp.length() - (fragment.length() + 1)); } builder.schemeSpecificPart(ssp); } else { + if (StringUtils.hasLength(scheme) && !StringUtils.hasLength(host)) { + throw new IllegalArgumentException("[" + uri + "] is not a valid URI"); + } builder.userInfo(userInfo); builder.host(host); if (StringUtils.hasLength(port)) { 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 d19c2740a2..34cebf5e0d 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 @@ -219,6 +219,12 @@ class UriComponentsBuilderTests { assertThat(resultIPv4compatible.getHost()).isEqualTo("[::192.168.1.1]"); } + @Test + void fromUriStringInvalidIPv6Host() { + assertThatIllegalArgumentException().isThrownBy(() -> + UriComponentsBuilder.fromUriString("http://[1abc:2abc:3abc::5ABC:6abc:8080/resource")); + } + @Test // SPR-11970 void fromUriStringNoPathWithReservedCharInQuery() { UriComponents result = UriComponentsBuilder.fromUriString("https://example.com?foo=bar@baz").build();