UriComponentsBuilder handles invalid port correctly

See gh-26905
This commit is contained in:
Jeon Ilwoong 2021-05-07 18:31:45 +09:00 committed by Rossen Stoyanchev
parent 5811212a9f
commit 65797d04f2
2 changed files with 40 additions and 1 deletions

View File

@ -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 = "(\\d*(?:\\{[^/]+?})?)";
private static final String PORT_PATTERN = "(.[^/]*(?:\\{[^/]+?})?)";
private static final String PATH_PATTERN = "([^?#]*)";

View File

@ -38,6 +38,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.fail;
/**
* Unit tests for {@link UriComponentsBuilder}.
@ -1272,4 +1273,42 @@ class UriComponentsBuilderTests {
assertThat(path).isEqualTo("/home/path");
}
@Test
void verifyNonNumberPort() {
UriComponents numberPort = UriComponentsBuilder.fromUriString("http://localhost:8080/path").build();
assertThat(numberPort.getScheme()).isEqualTo("http");
assertThat(numberPort.getHost()).isEqualTo("localhost");
assertThat(numberPort.getPort()).isEqualTo(8080);
assertThat(numberPort.getPath()).isEqualTo("/path");
UriComponents stringPort = UriComponentsBuilder.fromUriString("http://localhost:port/path").build();
try{
stringPort.getPort();
fail("port must be a number");
}catch (NumberFormatException e){
}
assertThat(stringPort.getScheme()).isEqualTo("http");
assertThat(stringPort.getHost()).isEqualTo("localhost");
assertThat(stringPort.getPath()).isEqualTo("/path");
UriComponents httpNumberPort = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/path").build();
assertThat(httpNumberPort.getScheme()).isEqualTo("http");
assertThat(httpNumberPort.getPort()).isEqualTo(8080);
assertThat(httpNumberPort.getHost()).isEqualTo("localhost");
assertThat(httpNumberPort.getPath()).isEqualTo("/path");
UriComponents httpStringPort= UriComponentsBuilder.fromHttpUrl("http://localhost:port/path").build();
try{
httpStringPort.getPort();
fail("port must be a number");
}catch (NumberFormatException e){
}
assertThat(httpStringPort.getScheme()).isEqualTo("http");
assertThat(httpStringPort.getHost()).isEqualTo("localhost");
assertThat(httpStringPort.getPath()).isEqualTo("/path");
}
}