Also apply X-Forwarded-Prefix in fromContextPath

Issue: SPR-12500
master
Rossen Stoyanchev 10 years ago
parent 9ef0bdcb17
commit 7f11c1ee2f
  1. 21
      spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java
  2. 19
      spring-webmvc/src/test/java/org/springframework/web/servlet/support/ServletUriComponentsBuilderTests.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}.

@ -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");

Loading…
Cancel
Save