From d64c48ff5f06aa444c199ae0cfa0d86f1b36af00 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 5 Mar 2015 21:52:27 -0500 Subject: [PATCH] UriComponentsBuilder.fromHttpRequest sets port correctly Issue: SPR-12771 --- .../web/util/UriComponentsBuilder.java | 1 + .../web/util/UriComponentsBuilderTests.java | 20 +++++++++++++++++ .../ServletUriComponentsBuilderTests.java | 22 ++++++++++++++++--- 3 files changed, 40 insertions(+), 3 deletions(-) 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 2364523468..48c4aa07ae 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 @@ -307,6 +307,7 @@ public class UriComponentsBuilder implements Cloneable { builder.scheme(scheme); builder.host(host); + builder.port(null); if (scheme.equals("http") && port != 80 || scheme.equals("https") && port != 443) { builder.port(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 6689f465dc..f5b5a94a1c 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 @@ -256,6 +256,26 @@ public class UriComponentsBuilderTests { assertEquals("a=1", result.getQuery()); } + // SPR-12771 + + @Test + public void fromHttpRequestResetsPortBeforeSettingIt() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addHeader("X-Forwarded-Proto", "https"); + request.addHeader("X-Forwarded-Host", "84.198.58.199"); + request.addHeader("X-Forwarded-Port", 443); + request.setScheme("http"); + request.setServerName("example.com"); + request.setServerPort(80); + request.setRequestURI("/rest/mobile/users/1"); + + UriComponents result = UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build(); + assertEquals("https", result.getScheme()); + assertEquals("84.198.58.199", result.getHost()); + assertEquals(-1, result.getPort()); + assertEquals("/rest/mobile/users/1", result.getPath()); + } + @Test public void path() throws URISyntaxException { UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/foo/bar"); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java index c9a8773947..5b68caffcd 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 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. @@ -36,15 +36,18 @@ public class ServletUriComponentsBuilderTests { private MockHttpServletRequest request; + @Before public void setup() { this.request = new MockHttpServletRequest(); this.request.setScheme("http"); this.request.setServerName("localhost"); this.request.setServerPort(-1); + this.request.setRequestURI("/mvc-showcase"); this.request.setContextPath("/mvc-showcase"); } + @Test public void fromRequest() { this.request.setRequestURI("/mvc-showcase/data/param"); @@ -64,7 +67,7 @@ public class ServletUriComponentsBuilderTests { public void fromRequestAtypicalHttpPort() { this.request.setServerPort(8080); String result = ServletUriComponentsBuilder.fromRequest(this.request).build().toUriString(); - assertEquals("http://localhost:8080", result); + assertEquals("http://localhost:8080/mvc-showcase", result); } @Test @@ -72,7 +75,7 @@ public class ServletUriComponentsBuilderTests { this.request.setScheme("https"); this.request.setServerPort(9043); String result = ServletUriComponentsBuilder.fromRequest(this.request).build().toUriString(); - assertEquals("https://localhost:9043", result); + assertEquals("https://localhost:9043/mvc-showcase", result); } @Test @@ -150,6 +153,19 @@ public class ServletUriComponentsBuilderTests { assertEquals("should have used the default port of the forwarded request", -1, result.getPort()); } + // SPR-12771 + + @Test + public void fromRequestWithForwardedProtoAndDefaultPort() { + this.request.addHeader("X-Forwarded-Proto", "https"); + this.request.addHeader("X-Forwarded-Host", "84.198.58.199"); + this.request.addHeader("X-Forwarded-Port", "443"); + this.request.setServerPort(80); + UriComponents result = ServletUriComponentsBuilder.fromRequest(this.request).build(); + + assertEquals("https://84.198.58.199/mvc-showcase", result.toString()); + } + @Test public void fromRequestWithForwardedPrefix() { this.request.setRequestURI("/bar");