Skip to content

Commit 7f11c1e

Browse files
committed
Also apply X-Forwarded-Prefix in fromContextPath
Issue: SPR-12500
1 parent 9ef0bdc commit 7f11c1e

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/support/ServletUriComponentsBuilder.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.springframework.web.util.WebUtils;
2929

3030
/**
31-
* A UriComponentsBuilder that extracts information from an HttpServletRequest.
31+
* A UriComponentsBuilder that extracts information from the HttpServletRequest.
3232
*
3333
* @author Rossen Stoyanchev
3434
* @since 3.1
@@ -56,8 +56,10 @@ protected ServletUriComponentsBuilder() {
5656
* an HttpServletRequest.
5757
*/
5858
public static ServletUriComponentsBuilder fromContextPath(HttpServletRequest request) {
59+
String path = request.getContextPath();
60+
path = prependForwardedPrefix(request, path);
5961
ServletUriComponentsBuilder builder = fromRequest(request);
60-
builder.replacePath(request.getContextPath());
62+
builder.replacePath(path);
6163
builder.replaceQuery(null);
6264
return builder;
6365
}
@@ -98,7 +100,6 @@ public static ServletUriComponentsBuilder fromRequest(HttpServletRequest request
98100
String scheme = request.getScheme();
99101
String host = request.getServerName();
100102
int port = request.getServerPort();
101-
String path = request.getRequestURI();
102103

103104
String hostHeader = request.getHeader("X-Forwarded-Host");
104105
if (StringUtils.hasText(hostHeader)) {
@@ -125,10 +126,8 @@ public static ServletUriComponentsBuilder fromRequest(HttpServletRequest request
125126
scheme = protocolHeader;
126127
}
127128

128-
String prefix = request.getHeader("X-Forwarded-Prefix");
129-
if (StringUtils.hasText(prefix)) {
130-
path = prefix + path;
131-
}
129+
String path = request.getRequestURI();
130+
path = prependForwardedPrefix(request, path);
132131

133132
ServletUriComponentsBuilder builder = new ServletUriComponentsBuilder();
134133
builder.scheme(scheme);
@@ -141,6 +140,14 @@ public static ServletUriComponentsBuilder fromRequest(HttpServletRequest request
141140
return builder;
142141
}
143142

143+
private static String prependForwardedPrefix(HttpServletRequest request, String path) {
144+
String prefix = request.getHeader("X-Forwarded-Prefix");
145+
if (StringUtils.hasText(prefix)) {
146+
path = prefix + path;
147+
}
148+
return path;
149+
}
150+
144151
/**
145152
* Same as {@link #fromContextPath(HttpServletRequest)} except the
146153
* request is obtained through {@link RequestContextHolder}.

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,15 @@ public void fromContextPath() {
176176
assertEquals("http://localhost/mvc-showcase", result);
177177
}
178178

179+
@Test
180+
public void fromContextPathWithForwardedPrefix() {
181+
request.addHeader("X-Forwarded-Prefix", "/prefix");
182+
request.setContextPath("/mvc-showcase");
183+
request.setRequestURI("/mvc-showcase/simple");
184+
String result = ServletUriComponentsBuilder.fromContextPath(request).build().toUriString();
185+
assertEquals("http://localhost/prefix/mvc-showcase", result);
186+
}
187+
179188
@Test
180189
public void fromServletMapping() {
181190
request.setRequestURI("/mvc-showcase/app/simple");
@@ -185,6 +194,16 @@ public void fromServletMapping() {
185194
assertEquals("http://localhost/mvc-showcase/app", result);
186195
}
187196

197+
@Test
198+
public void fromServletMappingWithForwardedPrefix() {
199+
request.addHeader("X-Forwarded-Prefix", "/prefix");
200+
request.setContextPath("/mvc-showcase");
201+
request.setServletPath("/app");
202+
request.setRequestURI("/mvc-showcase/app/simple");
203+
String result = ServletUriComponentsBuilder.fromServletMapping(request).build().toUriString();
204+
assertEquals("http://localhost/prefix/mvc-showcase/app", result);
205+
}
206+
188207
@Test
189208
public void fromCurrentRequest() {
190209
request.setRequestURI("/mvc-showcase/data/param");

0 commit comments

Comments
 (0)