From 7f11c1ee2f802b3a2a5b821c821b15c6705dc085 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 4 Dec 2014 10:15:55 -0500 Subject: [PATCH] Also apply X-Forwarded-Prefix in fromContextPath Issue: SPR-12500 --- .../support/ServletUriComponentsBuilder.java | 21 ++++++++++++------- .../ServletUriComponentsBuilderTests.java | 19 +++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java index 5ad1d24715..516a50249d 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java @@ -28,7 +28,7 @@ import org.springframework.web.util.UrlPathHelper; import org.springframework.web.util.WebUtils; /** - * A UriComponentsBuilder that extracts information from an HttpServletRequest. + * A UriComponentsBuilder that extracts information from the HttpServletRequest. * * @author Rossen Stoyanchev * @since 3.1 @@ -56,8 +56,10 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { * an HttpServletRequest. */ public static ServletUriComponentsBuilder fromContextPath(HttpServletRequest request) { + String path = request.getContextPath(); + path = prependForwardedPrefix(request, path); ServletUriComponentsBuilder builder = fromRequest(request); - builder.replacePath(request.getContextPath()); + builder.replacePath(path); builder.replaceQuery(null); return builder; } @@ -98,7 +100,6 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { String scheme = request.getScheme(); String host = request.getServerName(); int port = request.getServerPort(); - String path = request.getRequestURI(); String hostHeader = request.getHeader("X-Forwarded-Host"); if (StringUtils.hasText(hostHeader)) { @@ -125,10 +126,8 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { scheme = protocolHeader; } - String prefix = request.getHeader("X-Forwarded-Prefix"); - if (StringUtils.hasText(prefix)) { - path = prefix + path; - } + String path = request.getRequestURI(); + path = prependForwardedPrefix(request, path); ServletUriComponentsBuilder builder = new ServletUriComponentsBuilder(); builder.scheme(scheme); @@ -141,6 +140,14 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { return builder; } + private static String prependForwardedPrefix(HttpServletRequest request, String path) { + String prefix = request.getHeader("X-Forwarded-Prefix"); + if (StringUtils.hasText(prefix)) { + path = prefix + path; + } + return path; + } + /** * Same as {@link #fromContextPath(HttpServletRequest)} except the * request is obtained through {@link RequestContextHolder}. 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 9953bc79e5..0d4cf49e1b 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 @@ -176,6 +176,15 @@ public class ServletUriComponentsBuilderTests { assertEquals("http://localhost/mvc-showcase", result); } + @Test + public void fromContextPathWithForwardedPrefix() { + request.addHeader("X-Forwarded-Prefix", "/prefix"); + request.setContextPath("/mvc-showcase"); + request.setRequestURI("/mvc-showcase/simple"); + String result = ServletUriComponentsBuilder.fromContextPath(request).build().toUriString(); + assertEquals("http://localhost/prefix/mvc-showcase", result); + } + @Test public void fromServletMapping() { request.setRequestURI("/mvc-showcase/app/simple"); @@ -185,6 +194,16 @@ public class ServletUriComponentsBuilderTests { assertEquals("http://localhost/mvc-showcase/app", result); } + @Test + public void fromServletMappingWithForwardedPrefix() { + request.addHeader("X-Forwarded-Prefix", "/prefix"); + request.setContextPath("/mvc-showcase"); + request.setServletPath("/app"); + request.setRequestURI("/mvc-showcase/app/simple"); + String result = ServletUriComponentsBuilder.fromServletMapping(request).build().toUriString(); + assertEquals("http://localhost/prefix/mvc-showcase/app", result); + } + @Test public void fromCurrentRequest() { request.setRequestURI("/mvc-showcase/data/param");