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 6787571c4c9..d378a36840a 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 @@ -881,7 +881,8 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { "with the removeOnly=true. Request headers: " + headers); } - if (this.scheme != null && ((this.scheme.equals("http") && "80".equals(this.port)) || + if (this.scheme != null && + (((this.scheme.equals("http") || this.scheme.equals("ws")) && "80".equals(this.port)) || ((this.scheme.equals("https") || this.scheme.equals("wss")) && "443".equals(this.port)))) { port(null); } 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 52623dacc9a..d6d971c4ed5 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 @@ -378,7 +378,7 @@ class UriComponentsBuilderTests { @ParameterizedTest // gh-17368, gh-27097 @ValueSource(strings = {"https", "wss"}) - void fromHttpRequestResetsPortBeforeSettingIt(String protocol) { + void fromHttpRequestResetsPort443(String protocol) { MockHttpServletRequest request = new MockHttpServletRequest(); request.addHeader("X-Forwarded-Proto", protocol); request.addHeader("X-Forwarded-Host", "84.198.58.199"); @@ -397,6 +397,27 @@ class UriComponentsBuilderTests { assertThat(result.getPath()).isEqualTo("/rest/mobile/users/1"); } + @ParameterizedTest // gh-27097 + @ValueSource(strings = {"http", "ws"}) + void fromHttpRequestResetsPort80(String protocol) { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader("X-Forwarded-Proto", protocol); + request.addHeader("X-Forwarded-Host", "84.198.58.199"); + request.addHeader("X-Forwarded-Port", 80); + request.setScheme("http"); + request.setServerName("example.com"); + request.setServerPort(80); + request.setRequestURI("/path"); + + HttpRequest httpRequest = new ServletServerHttpRequest(request); + UriComponents result = UriComponentsBuilder.fromHttpRequest(httpRequest).build(); + + assertThat(result.getScheme()).isEqualTo(protocol); + assertThat(result.getHost()).isEqualTo("84.198.58.199"); + assertThat(result.getPort()).isEqualTo(-1); + assertThat(result.getPath()).isEqualTo("/path"); + } + @Test // SPR-14761 void fromHttpRequestWithForwardedIPv4Host() { MockHttpServletRequest request = new MockHttpServletRequest();