Also apply X-Forwarded-Prefix in fromContextPath
Issue: SPR-12500
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user