Skip to content

Commit 410fc6d

Browse files
committed
UriComponentsBuilder.fromHttpRequest sets port correctly
Cherry-picked from commit d64c48 on master Issue: SPR-12771
1 parent 3783591 commit 410fc6d

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java

+1
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,7 @@ public static UriComponentsBuilder fromHttpRequest(HttpRequest request) {
307307

308308
builder.scheme(scheme);
309309
builder.host(host);
310+
builder.port(null);
310311
if (scheme.equals("http") && port != 80 || scheme.equals("https") && port != 443) {
311312
builder.port(port);
312313
}

spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

+20
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,26 @@ public void fromHttpRequest() throws URISyntaxException {
256256
assertEquals("a=1", result.getQuery());
257257
}
258258

259+
// SPR-12771
260+
261+
@Test
262+
public void fromHttpRequestResetsPortBeforeSettingIt() throws Exception {
263+
MockHttpServletRequest request = new MockHttpServletRequest();
264+
request.addHeader("X-Forwarded-Proto", "https");
265+
request.addHeader("X-Forwarded-Host", "84.198.58.199");
266+
request.addHeader("X-Forwarded-Port", 443);
267+
request.setScheme("http");
268+
request.setServerName("example.com");
269+
request.setServerPort(80);
270+
request.setRequestURI("/rest/mobile/users/1");
271+
272+
UriComponents result = UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build();
273+
assertEquals("https", result.getScheme());
274+
assertEquals("84.198.58.199", result.getHost());
275+
assertEquals(-1, result.getPort());
276+
assertEquals("/rest/mobile/users/1", result.getPath());
277+
}
278+
259279
@Test
260280
public void path() throws URISyntaxException {
261281
UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/foo/bar");

spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java

+19-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -36,15 +36,18 @@ public class ServletUriComponentsBuilderTests {
3636

3737
private MockHttpServletRequest request;
3838

39+
3940
@Before
4041
public void setup() {
4142
this.request = new MockHttpServletRequest();
4243
this.request.setScheme("http");
4344
this.request.setServerName("localhost");
4445
this.request.setServerPort(-1);
46+
this.request.setRequestURI("/mvc-showcase");
4547
this.request.setContextPath("/mvc-showcase");
4648
}
4749

50+
4851
@Test
4952
public void fromRequest() {
5053
this.request.setRequestURI("/mvc-showcase/data/param");
@@ -64,15 +67,15 @@ public void fromRequestEncodedPath() {
6467
public void fromRequestAtypicalHttpPort() {
6568
this.request.setServerPort(8080);
6669
String result = ServletUriComponentsBuilder.fromRequest(this.request).build().toUriString();
67-
assertEquals("http://localhost:8080", result);
70+
assertEquals("http://localhost:8080/mvc-showcase", result);
6871
}
6972

7073
@Test
7174
public void fromRequestAtypicalHttpsPort() {
7275
this.request.setScheme("https");
7376
this.request.setServerPort(9043);
7477
String result = ServletUriComponentsBuilder.fromRequest(this.request).build().toUriString();
75-
assertEquals("https://localhost:9043", result);
78+
assertEquals("https://localhost:9043/mvc-showcase", result);
7679
}
7780

7881
@Test
@@ -150,6 +153,19 @@ public void fromRequestWithForwardedHostWithForwardedScheme() {
150153
assertEquals("should have used the default port of the forwarded request", -1, result.getPort());
151154
}
152155

156+
// SPR-12771
157+
158+
@Test
159+
public void fromRequestWithForwardedProtoAndDefaultPort() {
160+
this.request.addHeader("X-Forwarded-Proto", "https");
161+
this.request.addHeader("X-Forwarded-Host", "84.198.58.199");
162+
this.request.addHeader("X-Forwarded-Port", "443");
163+
this.request.setServerPort(80);
164+
UriComponents result = ServletUriComponentsBuilder.fromRequest(this.request).build();
165+
166+
assertEquals("https://84.198.58.199/mvc-showcase", result.toString());
167+
}
168+
153169
@Test
154170
public void fromRequestWithForwardedPrefix() {
155171
this.request.setRequestURI("/bar");

0 commit comments

Comments
 (0)