diff --git a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java index a037452b606..f26c2b737fd 100644 --- a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java +++ b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2021 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,6 +46,7 @@ import org.springframework.util.StringUtils; * @author Juergen Hoeller * @author Rossen Stoyanchev * @author Phillip Webb + * @author Sam Brannen * @since 3.1.3 * @see Hierarchical URIs */ @@ -192,7 +193,12 @@ final class HierarchicalUriComponents extends UriComponents { throw new IllegalStateException( "The port contains a URI variable but has not been expanded yet: " + this.port); } - return Integer.parseInt(this.port); + try { + return Integer.parseInt(this.port); + } + catch (NumberFormatException ex) { + throw new IllegalStateException("The port must be an integer: " + this.port); + } } @Override 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 69a7af3112d..1d3c06d8f7f 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 @@ -40,7 +40,7 @@ import org.springframework.web.testfixture.servlet.MockHttpServletRequest; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; /** * Unit tests for {@link UriComponentsBuilder}. @@ -1314,11 +1314,13 @@ class UriComponentsBuilderTests { @Test void verifyInvalidPort() { - String url = "http://localhost:port/path"; - assertThatThrownBy(() -> UriComponentsBuilder.fromUriString(url).build().toUri()) - .isInstanceOf(NumberFormatException.class); - assertThatThrownBy(() -> UriComponentsBuilder.fromHttpUrl(url).build().toUri()) - .isInstanceOf(NumberFormatException.class); + String url = "http://localhost:XXX/path"; + assertThatIllegalStateException() + .isThrownBy(() -> UriComponentsBuilder.fromUriString(url).build().toUri()) + .withMessage("The port must be an integer: XXX"); + assertThatIllegalStateException() + .isThrownBy(() -> UriComponentsBuilder.fromHttpUrl(url).build().toUri()) + .withMessage("The port must be an integer: XXX"); } @Test // gh-27039 diff --git a/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java b/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java index 541cf18042b..7bbb2c34299 100644 --- a/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/UriComponentsTests.java @@ -30,6 +30,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.springframework.web.util.UriComponentsBuilder.fromHttpUrl; import static org.springframework.web.util.UriComponentsBuilder.fromUriString; /** @@ -151,6 +152,29 @@ class UriComponentsTests { assertThat(uri4.toUriString()).isEqualTo("https://example.com:8080/bar"); } + @Test // gh-28521 + void invalidPort() { + assertExceptionsForInvalidPort(fromUriString("https://example.com:XXX/bar").build()); + assertExceptionsForInvalidPort(fromUriString("https://example.com/bar").port("XXX").build()); + assertExceptionsForInvalidPort(fromHttpUrl("https://example.com:XXX/bar").build()); + assertExceptionsForInvalidPort(fromHttpUrl("https://example.com/bar").port("XXX").build()); + } + + private void assertExceptionsForInvalidPort(UriComponents uriComponents) { + assertThatIllegalStateException() + .isThrownBy(uriComponents::getPort) + .withMessage("The port must be an integer: XXX"); + assertThatIllegalStateException() + .isThrownBy(uriComponents::toUri) + .withMessage("The port must be an integer: XXX"); + assertThatIllegalStateException() + .isThrownBy(uriComponents::toUriString) + .withMessage("The port must be an integer: XXX"); + assertThatIllegalStateException() + .isThrownBy(uriComponents::toString) + .withMessage("The port must be an integer: XXX"); + } + @Test void expandEncoded() { assertThatIllegalStateException().isThrownBy(() ->