diff --git a/spring-web/src/main/java/org/springframework/web/filter/ForwardedHeaderFilter.java b/spring-web/src/main/java/org/springframework/web/filter/ForwardedHeaderFilter.java
index b71217dcdc0..f120b25976c 100644
--- a/spring-web/src/main/java/org/springframework/web/filter/ForwardedHeaderFilter.java
+++ b/spring-web/src/main/java/org/springframework/web/filter/ForwardedHeaderFilter.java
@@ -50,24 +50,25 @@ import org.springframework.web.util.UrlPathHelper;
import org.springframework.web.util.WebUtils;
/**
- * Extract values from "Forwarded" and "X-Forwarded-*" headers, wrap the request
- * and response, and make they reflect the client-originated protocol and
- * address in the following methods:
- *
- * - {@link HttpServletRequest#getServerName() getServerName()}
- *
- {@link HttpServletRequest#getServerPort() getServerPort()}
- *
- {@link HttpServletRequest#getScheme() getScheme()}
- *
- {@link HttpServletRequest#isSecure() isSecure()}
- *
- {@link HttpServletResponse#sendRedirect(String) sendRedirect(String)}.
- *
+ * Extract values from the standard "Forwarded" header or the "X-Forwarded-*"
+ * alternative header, wrap the request and response, and make them reflect
+ * the originating client's perspective.
*
- * There are security considerations for forwarded headers since an application
- * cannot know if the headers were added by a proxy, as intended, or by a malicious
- * client. This is why a proxy at the boundary of trust should be configured to
- * remove untrusted Forwarded headers that come from the outside.
+ *
An application cannot know if forwarded headers were added by a
+ * trusted proxy or by a malicious client. It is imperative that a proxy at the
+ * edge of trust is configured to drop forwarded headers from the outside,
+ * including both the standard "Forwarded" header and the "X-Forwarded-*"
+ * alternative headers.
*
- *
You can also configure the ForwardedHeaderFilter with {@link #setRemoveOnly removeOnly},
- * in which case it removes but does not use the headers.
+ *
Proxies are typically configured to support either the standard "Forwarded"
+ * header or the "X-Forwarded-*" header. Accordingly, an application must indicate
+ * which of the two alternatives it expects through a constructor argument.
+ *
+ *
Support for "X-Forwarded-Prefix" is enabled separately via
+ * {@link #setUseForwardedPrefix}.
+ *
+ *
You can configure this filter in {@link #setRemoveOnly removeOnly} mode,
+ * in which case it hides the headers without using them.
*
* @author Rossen Stoyanchev
* @author EddĂș MelĂ©ndez
@@ -87,20 +88,46 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
static {
FORWARDED_HEADER_NAMES.add("Forwarded");
+ FORWARDED_HEADER_NAMES.add("X-Forwarded-Proto");
+ FORWARDED_HEADER_NAMES.add("X-Forwarded-Ssl");
FORWARDED_HEADER_NAMES.add("X-Forwarded-Host");
FORWARDED_HEADER_NAMES.add("X-Forwarded-Port");
- FORWARDED_HEADER_NAMES.add("X-Forwarded-Proto");
- FORWARDED_HEADER_NAMES.add("X-Forwarded-Prefix");
- FORWARDED_HEADER_NAMES.add("X-Forwarded-Ssl");
FORWARDED_HEADER_NAMES.add("X-Forwarded-For");
+ FORWARDED_HEADER_NAMES.add("X-Forwarded-Prefix");
}
+ private final boolean useStandardHeader;
+
+ private boolean useForwardedPrefix;
+
private boolean removeOnly;
private boolean relativeRedirects;
+ /**
+ * Create an instance of the filter and specify whether it should use the
+ * standard "Forwarded" header or the "X-Forwarded-*" alternative headers.
+ *
"X-Forwarded-Prefix" is enabled separately via {@link #setUseForwardedPrefix}.
+ * @param useStandardHeader whether to use the standard "Forwarded" header
+ * (true), or the "X-Forwarded-*" alternative headers (false).
+ * @since 7.1
+ */
+ public ForwardedHeaderFilter(boolean useStandardHeader) {
+ this.useStandardHeader = useStandardHeader;
+ }
+
+
+ /**
+ * Enable use of "X-Forwarded-Prefix" to determine the context path.
+ *
By default, this is set to "false" in which case the header is ignored.
+ * @since 7.1
+ */
+ public void setUseForwardedPrefix(boolean useForwardedPrefix) {
+ this.useForwardedPrefix = useForwardedPrefix;
+ }
+
/**
* Enables mode in which any "Forwarded" or "X-Forwarded-*" headers are
* removed only and the information in them ignored.
@@ -159,10 +186,12 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
HttpServletRequest wrappedRequest = null;
HttpServletResponse wrappedResponse = null;
try {
- wrappedRequest = new ForwardedHeaderExtractingRequest(request);
+ wrappedRequest = new ForwardedHeaderExtractingRequest(
+ request, this.useStandardHeader, this.useForwardedPrefix);
+
wrappedResponse = this.relativeRedirects ?
RelativeRedirectResponseWrapper.wrapIfNecessary(response, HttpStatus.SEE_OTHER) :
- new ForwardedHeaderExtractingResponse(response, wrappedRequest);
+ new ForwardedHeaderExtractingResponse(response, wrappedRequest, this.useStandardHeader);
}
catch (Throwable ex) {
if (logger.isDebugEnabled()) {
@@ -260,13 +289,22 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
private final ForwardedPrefixExtractor forwardedPrefixExtractor;
- ForwardedHeaderExtractingRequest(HttpServletRequest servletRequest) {
+ ForwardedHeaderExtractingRequest(
+ HttpServletRequest servletRequest, boolean useStandardHeader, boolean useForwardedPrefix) {
+
super(servletRequest);
ServerHttpRequest request = new ServletServerHttpRequest(servletRequest);
URI uri = request.getURI();
HttpHeaders headers = request.getHeaders();
- UriComponents uriComponents = ForwardedHeaderUtils.adaptFromForwardedHeaders(uri, headers).build();
+ InetSocketAddress remoteAddress = request.getRemoteAddress();
+ InetSocketAddress localAddress = request.getLocalAddress();
+
+ ForwardedHeaderUtils.ForwardedInfo info = (useStandardHeader ?
+ ForwardedHeaderUtils.parseStandardHeader(uri, headers, remoteAddress, localAddress) :
+ ForwardedHeaderUtils.parseXForwardedHeaders(uri, headers, remoteAddress, localAddress));
+
+ UriComponents uriComponents = info.uriComponentsBuilder().build();
int port = uriComponents.getPort();
this.scheme = uriComponents.getScheme();
@@ -274,14 +312,15 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
this.host = uriComponents.getHost();
this.port = (port == -1 ? (this.secure ? 443 : 80) : port);
- this.remoteAddress = ForwardedHeaderUtils.parseForwardedFor(uri, headers, request.getRemoteAddress());
- this.localAddress = ForwardedHeaderUtils.parseForwardedBy(uri, headers, request.getLocalAddress());
+ this.remoteAddress = info.forAddress();
+ this.localAddress = info.byAddress();
// Use Supplier as Tomcat updates delegate request on FORWARD
Supplier requestSupplier = () -> (HttpServletRequest) getRequest();
this.forwardedPrefixExtractor = new ForwardedPrefixExtractor(
- requestSupplier, (this.scheme + "://" + this.host + (port == -1 ? "" : ":" + port)));
+ requestSupplier, (this.scheme + "://" + this.host + (port == -1 ? "" : ":" + port)),
+ useForwardedPrefix);
}
@Override
@@ -380,14 +419,17 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
* {@link HttpServletRequestWrapper#getRequest() delegate request} which
* may change during a forward (for example, Tomcat.
* @param baseUrl the host, scheme, and port based on forwarded headers
+ * @param useForwardedPrefix whether to use "X-Forwarded-Prefix"
*/
- public ForwardedPrefixExtractor(Supplier delegate, String baseUrl) {
+ public ForwardedPrefixExtractor(
+ Supplier delegate, String baseUrl, boolean useForwardedPrefix) {
+
this.delegate = delegate;
this.baseUrl = baseUrl;
this.actualRequestUri = delegate.get().getRequestURI();
// Keep call order
- this.forwardedPrefix = initForwardedPrefix(delegate.get());
+ this.forwardedPrefix = (useForwardedPrefix ? initForwardedPrefix(delegate.get()) : null);
this.requestUri = initRequestUri();
this.requestUrl = initRequestUrl();
}
@@ -474,9 +516,14 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
private final HttpServletRequest request;
- ForwardedHeaderExtractingResponse(HttpServletResponse response, HttpServletRequest request) {
+ private final boolean useStandardHeader;
+
+ ForwardedHeaderExtractingResponse(
+ HttpServletResponse response, HttpServletRequest request, boolean useStandardHeader) {
+
super(response);
this.request = request;
+ this.useStandardHeader = useStandardHeader;
}
@Override
@@ -508,7 +555,11 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
URI uri = httpRequest.getURI();
HttpHeaders headers = httpRequest.getHeaders();
- String result = ForwardedHeaderUtils.adaptFromForwardedHeaders(uri, headers)
+ ForwardedHeaderUtils.ForwardedInfo info = (this.useStandardHeader ?
+ ForwardedHeaderUtils.parseStandardHeader(uri, headers, null, null) :
+ ForwardedHeaderUtils.parseXForwardedHeaders(uri, headers, null, null));
+
+ String result = info.uriComponentsBuilder()
.replacePath(path)
.replaceQuery(uriComponents.getQuery())
.fragment(uriComponents.getFragment())
diff --git a/spring-web/src/main/java/org/springframework/web/server/adapter/ForwardedHeaderTransformer.java b/spring-web/src/main/java/org/springframework/web/server/adapter/ForwardedHeaderTransformer.java
index ca28bb5be83..99fcba8c0f5 100644
--- a/spring-web/src/main/java/org/springframework/web/server/adapter/ForwardedHeaderTransformer.java
+++ b/spring-web/src/main/java/org/springframework/web/server/adapter/ForwardedHeaderTransformer.java
@@ -18,7 +18,6 @@ package org.springframework.web.server.adapter;
import java.net.InetSocketAddress;
import java.net.URI;
-import java.net.URISyntaxException;
import java.util.Collections;
import java.util.Locale;
import java.util.Set;
@@ -32,12 +31,11 @@ import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.LinkedCaseInsensitiveMap;
import org.springframework.util.StringUtils;
import org.springframework.web.util.ForwardedHeaderUtils;
-import org.springframework.web.util.UriComponents;
/**
- * Extract values from "Forwarded" and "X-Forwarded-*" headers to override
- * the request URI (i.e. {@link ServerHttpRequest#getURI()}) so it reflects
- * the client-originated protocol and address.
+ * Extract values from the standard "Forwarded" header or the "X-Forwarded-*"
+ * alternative headers to override the request information to reflect the
+ * originating client's perspective.
*
* An instance of this class is typically declared as a bean with the name
* "forwardedHeaderTransformer" and detected by
@@ -45,13 +43,22 @@ import org.springframework.web.util.UriComponents;
* can also be registered directly via
* {@link WebHttpHandlerBuilder#forwardedHeaderTransformer(ForwardedHeaderTransformer)}.
*
- *
There are security considerations for forwarded headers since an application
- * cannot know if the headers were added by a proxy, as intended, or by a malicious
- * client. This is why a proxy at the boundary of trust should be configured to
- * remove untrusted Forwarded headers that come from the outside.
+ *
An application cannot know if forwarded headers were added by a
+ * trusted proxy or by a malicious client. It is imperative that a proxy at the
+ * edge of trust is configured to drop forwarded headers from the outside,
+ * including both the standard "Forwarded" header and the "X-Forwarded-*"
+ * alternative headers.
*
- *
You can also configure the ForwardedHeaderFilter with {@link #setRemoveOnly removeOnly},
- * in which case it removes but does not use the headers.
+ *
Proxies are typically configured to support either the standard "Forwarded"
+ * header or the "X-Forwarded-*" header. Accordingly, an application must indicate
+ * which of the two alternatives it expects through a constructor argument.
+ * The "X-Forwarded-Prefix" needs to be enabled separately if needed.
+ *
+ *
Support for "X-Forwarded-Prefix" is enabled separately via
+ * {@link #setUseForwardedPrefix}.
+ *
+ *
You can configure this transformer in {@link #setRemoveOnly removeOnly} mode,
+ * in which case it hides the headers without using them.
*
* @author Rossen Stoyanchev
* @author Sebastien Deleuze
@@ -67,18 +74,44 @@ public class ForwardedHeaderTransformer implements Function"X-Forwarded-Prefix" is enabled separately via {@link #setUseForwardedPrefix}.
+ * @param useStandardHeader whether to use the standard "Forwarded" header
+ * (true), or the "X-Forwarded-*" alternative headers (false).
+ * @since 7.1
+ */
+ public ForwardedHeaderTransformer(boolean useStandardHeader) {
+ this.useStandardHeader = useStandardHeader;
+ }
+
+
+ /**
+ * Enable use of "X-Forwarded-Prefix" to determine the context path.
+ * By default, this is set to "false" in which case the header is ignored.
+ * @since 7.1
+ */
+ public void setUseForwardedPrefix(boolean useForwardedPrefix) {
+ this.useForwardedPrefix = useForwardedPrefix;
+ }
+
/**
* Enable mode in which any "Forwarded" or "X-Forwarded-*" headers are
* removed only and the information in them ignored.
@@ -103,54 +136,50 @@ public class ForwardedHeaderTransformer implements Function builder) {
+ private ServerHttpRequest adaptFromForwardedHeaders(
+ MockServerHttpRequest.BaseBuilder> builder, boolean useStandardForwardedHeader) {
+
MockServerWebExchange exchange = MockServerWebExchange.from(builder);
- return new ForwardedHeaderTransformer().apply(exchange.getRequest());
+ return new ForwardedHeaderTransformer(useStandardForwardedHeader).apply(exchange.getRequest());
}
}
diff --git a/spring-web/src/test/java/org/springframework/web/filter/ForwardedHeaderFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/ForwardedHeaderFilterTests.java
index 0ed3d01661e..d67788d2029 100644
--- a/spring-web/src/test/java/org/springframework/web/filter/ForwardedHeaderFilterTests.java
+++ b/spring-web/src/test/java/org/springframework/web/filter/ForwardedHeaderFilterTests.java
@@ -68,8 +68,6 @@ class ForwardedHeaderFilterTests {
private static final String X_FORWARDED_FOR = "x-forwarded-for";
- private final ForwardedHeaderFilter filter = new ForwardedHeaderFilter();
-
@SuppressWarnings("serial")
private final MockFilterChain filterChain = new MockFilterChain(new HttpServlet() {});
@@ -99,12 +97,12 @@ class ForwardedHeaderFilterTests {
private void testShouldFilter(String headerName) {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader(headerName, "1");
- assertThat(this.filter.shouldNotFilter(request)).isFalse();
+ assertThat(new ForwardedHeaderFilter(false).shouldNotFilter(request)).isFalse();
}
@Test
void shouldNotFilter() {
- assertThat(this.filter.shouldNotFilter(new MockHttpServletRequest())).isTrue();
+ assertThat(new ForwardedHeaderFilter(false).shouldNotFilter(new MockHttpServletRequest())).isTrue();
}
@ParameterizedTest
@@ -117,7 +115,8 @@ class ForwardedHeaderFilterTests {
this.request.addHeader("foo", "bar");
this.request.addHeader(X_FORWARDED_FOR, "[203.0.113.195]");
- this.filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
+ ForwardedHeaderFilter filter = new ForwardedHeaderFilter(false);
+ filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
HttpServletRequest actual = (HttpServletRequest) this.filterChain.getRequest();
assertThat(actual).isNotNull();
@@ -145,8 +144,9 @@ class ForwardedHeaderFilterTests {
this.request.addHeader("foo", "bar");
this.request.addHeader(X_FORWARDED_FOR, "203.0.113.195");
- this.filter.setRemoveOnly(true);
- this.filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
+ ForwardedHeaderFilter filter = new ForwardedHeaderFilter(false);
+ filter.setRemoveOnly(true);
+ filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
HttpServletRequest actual = (HttpServletRequest) this.filterChain.getRequest();
assertThat(actual).isNotNull();
@@ -175,7 +175,8 @@ class ForwardedHeaderFilterTests {
this.request.addHeader(X_FORWARDED_PORT, "443");
this.request.addHeader("foo", "bar");
- this.filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
+ ForwardedHeaderFilter filter = new ForwardedHeaderFilter(false);
+ filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
HttpServletRequest actual = (HttpServletRequest) this.filterChain.getRequest();
assertThat(actual).isNotNull();
@@ -198,14 +199,15 @@ class ForwardedHeaderFilterTests {
this.request.addHeader(X_FORWARDED_HOST, "www.mycompany.example");
this.request.addHeader(X_FORWARDED_PORT, "443");
- this.filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
+ ForwardedHeaderFilter filter = new ForwardedHeaderFilter(false);
+ filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
HttpServletRequest wrappedRequest = (HttpServletRequest) this.filterChain.getRequest();
this.request.setDispatcherType(DispatcherType.FORWARD);
this.request.setRequestURI("/bar");
this.filterChain.reset();
- this.filter.doFilter(wrappedRequest, new MockHttpServletResponse(), this.filterChain);
+ filter.doFilter(wrappedRequest, new MockHttpServletResponse(), this.filterChain);
HttpServletRequest actual = (HttpServletRequest) this.filterChain.getRequest();
assertThat(actual).isNotNull();
@@ -223,7 +225,9 @@ class ForwardedHeaderFilterTests {
this.request.addHeader(X_FORWARDED_PREFIX, "/app");
this.request.setAttribute(WebUtils.ERROR_REQUEST_URI_ATTRIBUTE, "/foo");
- this.filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
+ ForwardedHeaderFilter filter = new ForwardedHeaderFilter(false);
+ filter.setUseForwardedPrefix(true);
+ filter.doFilter(this.request, new MockHttpServletResponse(), this.filterChain);
HttpServletRequest wrappedRequest = (HttpServletRequest) this.filterChain.getRequest();
@@ -241,7 +245,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(FORWARDED, "for=127.0.0.1:");
MockHttpServletResponse response = new MockHttpServletResponse();
- filter.doFilter(request, response, filterChain);
+ new ForwardedHeaderFilter(true).doFilter(request, response, filterChain);
assertThat(response.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST.value());
}
@@ -250,7 +254,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(FORWARDED, "for=\"2a02:918:175:ab60:45ee:c12c:dac1:808b\"");
MockHttpServletResponse response = new MockHttpServletResponse();
- filter.doFilter(request, response, filterChain);
+ new ForwardedHeaderFilter(true).doFilter(request, response, filterChain);
assertThat(response.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST.value());
}
@@ -259,7 +263,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PORT, "invalid");
MockHttpServletResponse response = new MockHttpServletResponse();
- filter.doFilter(request, response, filterChain);
+ new ForwardedHeaderFilter(false).doFilter(request, response, filterChain);
assertThat(response.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST.value());
}
@@ -305,15 +309,15 @@ class ForwardedHeaderFilterTests {
assertThat(actual).isEqualTo("/prefix");
}
- private String filterAndGetContextPath() throws ServletException, IOException {
- return filterAndGetWrappedRequest().getContextPath();
+ private String filterAndGetContextPath() throws Exception {
+ return filterAndGetWrappedRequest(false).getContextPath();
}
@Test
void contextPathPreserveEncoding() throws Exception {
request.setContextPath("/app%20");
request.setRequestURI("/app%20/path/");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getContextPath()).isEqualTo("/app%20");
assertThat(actual.getRequestURI()).isEqualTo("/app%20/path/");
@@ -325,7 +329,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/");
request.setContextPath("/app");
request.setRequestURI("/app/path");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getContextPath()).isEmpty();
assertThat(actual.getRequestURI()).isEqualTo("/path");
@@ -336,7 +340,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/");
request.setContextPath("/app");
request.setRequestURI("/app/path/");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getContextPath()).isEmpty();
assertThat(actual.getRequestURI()).isEqualTo("/path/");
@@ -346,7 +350,7 @@ class ForwardedHeaderFilterTests {
void requestUriPreserveEncoding() throws Exception {
request.setContextPath("/app");
request.setRequestURI("/app/path%20with%20spaces/");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getContextPath()).isEqualTo("/app");
assertThat(actual.getRequestURI()).isEqualTo("/app/path%20with%20spaces/");
@@ -358,7 +362,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/");
request.setContextPath("/app");
request.setRequestURI("/app");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getContextPath()).isEmpty();
assertThat(actual.getRequestURI()).isEqualTo("/");
@@ -369,7 +373,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/");
request.setContextPath("/app");
request.setRequestURI("/app/");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getContextPath()).isEmpty();
assertThat(actual.getRequestURI()).isEqualTo("/");
@@ -379,7 +383,7 @@ class ForwardedHeaderFilterTests {
void requestUriPreserveSemicolonContent() throws Exception {
request.setContextPath("");
request.setRequestURI("/path;a=b/with/semicolon");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getContextPath()).isEmpty();
assertThat(actual.getRequestURI()).isEqualTo("/path;a=b/with/semicolon");
@@ -404,7 +408,7 @@ class ForwardedHeaderFilterTests {
};
request.addHeader(X_FORWARDED_PREFIX, "/prefix");
request.setRequestURI("/path");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getRequestURI()).isEqualTo("/prefix/path");
}
@@ -414,7 +418,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/prefix");
request.setRequestURI("/mvc-showcase");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/prefix/mvc-showcase");
}
@@ -423,7 +427,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/prefix/");
request.setRequestURI("/mvc-showcase");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/prefix/mvc-showcase");
}
@@ -432,7 +436,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/first,/second");
request.setRequestURI("/mvc-showcase");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/first/second/mvc-showcase");
}
@@ -441,7 +445,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/first/,/second//");
request.setRequestURI("/mvc-showcase");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/first/second/mvc-showcase");
}
@@ -450,7 +454,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/prefix,/");
request.setRequestURI("/mvc-showcase");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/prefix/mvc-showcase");
}
@@ -459,7 +463,7 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PREFIX, "/prefix/");
request.setRequestURI("/mvc-showcase");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
actual.getRequestURL().append("?key=value");
assertThat(actual.getRequestURL().toString()).isEqualTo("http://localhost/prefix/mvc-showcase");
}
@@ -471,7 +475,7 @@ class ForwardedHeaderFilterTests {
@Test
void xForwardedForEmpty() throws Exception {
request.addHeader(X_FORWARDED_FOR, "");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getRemoteAddr()).isEqualTo(MockHttpServletRequest.DEFAULT_REMOTE_ADDR);
assertThat(actual.getRemoteHost()).isEqualTo(MockHttpServletRequest.DEFAULT_REMOTE_HOST);
@@ -481,7 +485,7 @@ class ForwardedHeaderFilterTests {
@Test
void xForwardedForSingleIdentifier() throws Exception {
request.addHeader(X_FORWARDED_FOR, "203.0.113.195");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getRemoteAddr()).isEqualTo(actual.getRemoteHost()).isEqualTo("203.0.113.195");
assertThat(actual.getRemotePort()).isEqualTo(MockHttpServletRequest.DEFAULT_SERVER_PORT);
@@ -490,7 +494,7 @@ class ForwardedHeaderFilterTests {
@Test
void xForwardedForMultipleIdentifiers() throws Exception {
request.addHeader(X_FORWARDED_FOR, "203.0.113.195, 70.41.3.18, 150.172.238.178");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(false);
assertThat(actual.getRemoteAddr()).isEqualTo(actual.getRemoteHost()).isEqualTo("203.0.113.195");
assertThat(actual.getRemotePort()).isEqualTo(MockHttpServletRequest.DEFAULT_SERVER_PORT);
@@ -499,7 +503,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedForIpV4Identifier() throws Exception {
request.addHeader(FORWARDED, "for=203.0.113.195");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getRemoteAddr()).isEqualTo(actual.getRemoteHost()).isEqualTo("203.0.113.195");
assertThat(actual.getRemotePort()).isEqualTo(MockHttpServletRequest.DEFAULT_SERVER_PORT);
@@ -508,7 +512,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedForIpV6Identifier() throws Exception {
request.addHeader(FORWARDED, "for=\"[2001:db8:cafe::17]\"");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getRemoteAddr()).isEqualTo(actual.getRemoteHost()).isEqualTo("[2001:db8:cafe::17]");
assertThat(actual.getRemotePort()).isEqualTo(MockHttpServletRequest.DEFAULT_SERVER_PORT);
@@ -517,7 +521,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedForIpV4IdentifierWithPort() throws Exception {
request.addHeader(FORWARDED, "for=\"203.0.113.195:47011\"");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getRemoteAddr()).isEqualTo(actual.getRemoteHost()).isEqualTo("203.0.113.195");
assertThat(actual.getRemotePort()).isEqualTo(47011);
@@ -526,7 +530,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedForIpV6IdentifierWithPort() throws Exception {
request.addHeader(FORWARDED, "For=\"[2001:db8:cafe::17]:47011\"");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getRemoteAddr()).isEqualTo(actual.getRemoteHost()).isEqualTo("[2001:db8:cafe::17]");
assertThat(actual.getRemotePort()).isEqualTo(47011);
@@ -535,7 +539,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedForMultipleIdentifiers() throws Exception {
request.addHeader(FORWARDED, "for=203.0.113.195;proto=http, for=\"[2001:db8:cafe::17]\", for=unknown");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getRemoteAddr()).isEqualTo(actual.getRemoteHost()).isEqualTo("203.0.113.195");
assertThat(actual.getRemotePort()).isEqualTo(MockHttpServletRequest.DEFAULT_SERVER_PORT);
@@ -549,7 +553,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedByIpV4Identifier() throws Exception {
request.addHeader(FORWARDED, "By=203.0.113.195");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getLocalAddr()).isEqualTo(actual.getLocalAddr()).isEqualTo("203.0.113.195");
assertThat(actual.getLocalPort()).isEqualTo(MockHttpServletRequest.DEFAULT_SERVER_PORT);
@@ -558,7 +562,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedByIpV6Identifier() throws Exception {
request.addHeader(FORWARDED, "By=\"[2001:db8:cafe::17]\"");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getLocalAddr()).isEqualTo(actual.getLocalAddr()).isEqualTo("[2001:db8:cafe::17]");
assertThat(actual.getLocalPort()).isEqualTo(MockHttpServletRequest.DEFAULT_SERVER_PORT);
@@ -567,7 +571,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedByIpV4IdentifierWithPort() throws Exception {
request.addHeader(FORWARDED, "By=\"203.0.113.195:47011\"");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getLocalAddr()).isEqualTo(actual.getLocalAddr()).isEqualTo("203.0.113.195");
assertThat(actual.getLocalPort()).isEqualTo(47011);
@@ -576,7 +580,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedByIpV6IdentifierWithPort() throws Exception {
request.addHeader(FORWARDED, "By=\"[2001:db8:cafe::17]:47011\"");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getLocalAddr()).isEqualTo(actual.getLocalAddr()).isEqualTo("[2001:db8:cafe::17]");
assertThat(actual.getLocalPort()).isEqualTo(47011);
@@ -585,7 +589,7 @@ class ForwardedHeaderFilterTests {
@Test
void forwardedByMultipleIdentifiers() throws Exception {
request.addHeader(FORWARDED, "by=203.0.113.195;proto=http, by=\"[2001:db8:cafe::17]\", by=unknown");
- HttpServletRequest actual = filterAndGetWrappedRequest();
+ HttpServletRequest actual = filterAndGetWrappedRequest(true);
assertThat(actual.getLocalAddr()).isEqualTo(actual.getLocalAddr()).isEqualTo("203.0.113.195");
assertThat(actual.getLocalPort()).isEqualTo(MockHttpServletRequest.DEFAULT_SERVER_PORT);
@@ -596,6 +600,8 @@ class ForwardedHeaderFilterTests {
@Nested
class SendRedirect {
+ private ForwardedHeaderFilter filter;
+
@Test
void sendRedirectWithAbsolutePath() throws Exception {
request.addHeader(X_FORWARDED_PROTO, "https");
@@ -721,7 +727,9 @@ class ForwardedHeaderFilterTests {
request.addHeader(X_FORWARDED_PROTO, "https");
request.addHeader(X_FORWARDED_HOST, "example.com");
request.addHeader(X_FORWARDED_PORT, "443");
- filter.setRelativeRedirects(true);
+
+ this.filter = new ForwardedHeaderFilter(false);
+ this.filter.setRelativeRedirects(true);
String location = sendRedirect("/a");
assertThat(location).isEqualTo("/a");
@@ -729,7 +737,8 @@ class ForwardedHeaderFilterTests {
@Test
void sendRedirectWhenRequestOnlyAndNoXForwardedThenUsesRelativeRedirects() throws Exception {
- filter.setRelativeRedirects(true);
+ this.filter = new ForwardedHeaderFilter(true);
+ this.filter.setRelativeRedirects(true);
String location = sendRedirect("/a");
assertThat(location).isEqualTo("/a");
@@ -744,16 +753,19 @@ class ForwardedHeaderFilterTests {
res.sendRedirect(location);
}
};
+ this.filter = (this.filter == null ? new ForwardedHeaderFilter(false) : this.filter);
MockHttpServletResponse response = new MockHttpServletResponse();
- FilterChain filterChain = new MockFilterChain(mock(), filter, redirectFilter);
+ FilterChain filterChain = new MockFilterChain(mock(), this.filter, redirectFilter);
filterChain.doFilter(request, response);
return response.getRedirectedUrl();
}
}
- private HttpServletRequest filterAndGetWrappedRequest() throws ServletException, IOException {
+ private HttpServletRequest filterAndGetWrappedRequest(boolean useStandardHeader) throws Exception {
MockHttpServletResponse response = new MockHttpServletResponse();
- this.filter.doFilterInternal(this.request, response, this.filterChain);
+ ForwardedHeaderFilter filter = new ForwardedHeaderFilter(useStandardHeader);
+ filter.setUseForwardedPrefix(true);
+ filter.doFilterInternal(this.request, response, this.filterChain);
return (HttpServletRequest) this.filterChain.getRequest();
}
diff --git a/spring-web/src/test/java/org/springframework/web/server/adapter/ForwardedHeaderTransformerTests.java b/spring-web/src/test/java/org/springframework/web/server/adapter/ForwardedHeaderTransformerTests.java
index 0381cbac5f5..b89ec01c4c2 100644
--- a/spring-web/src/test/java/org/springframework/web/server/adapter/ForwardedHeaderTransformerTests.java
+++ b/spring-web/src/test/java/org/springframework/web/server/adapter/ForwardedHeaderTransformerTests.java
@@ -39,11 +39,11 @@ class ForwardedHeaderTransformerTests {
private static final String BASE_URL = "https://example.com/path";
- private final ForwardedHeaderTransformer requestMutator = new ForwardedHeaderTransformer();
@Test
void removeOnly() {
- this.requestMutator.setRemoveOnly(true);
+ ForwardedHeaderTransformer requestMutator = new ForwardedHeaderTransformer(true);
+ requestMutator.setRemoveOnly(true);
HttpHeaders headers = new HttpHeaders();
headers.add("Forwarded", "for=192.0.2.60;proto=http;by=203.0.113.43");
@@ -53,7 +53,7 @@ class ForwardedHeaderTransformerTests {
headers.add("X-Forwarded-Prefix", "prefix");
headers.add("X-Forwarded-Ssl", "on");
headers.add("X-Forwarded-For", "203.0.113.195");
- ServerHttpRequest request = this.requestMutator.apply(getRequest(headers));
+ ServerHttpRequest request = requestMutator.apply(getRequest(headers));
assertForwardedHeadersRemoved(request);
}
@@ -65,7 +65,8 @@ class ForwardedHeaderTransformerTests {
headers.add("X-Forwarded-Port", "443");
headers.add("X-Forwarded-Proto", "https");
headers.add("foo", "bar");
- ServerHttpRequest request = this.requestMutator.apply(getRequest(headers));
+
+ ServerHttpRequest request = new ForwardedHeaderTransformer(false).apply(getRequest(headers));
assertThat(request.getURI()).isEqualTo(URI.create("https://84.198.58.199/path"));
assertForwardedHeadersRemoved(request);
@@ -75,7 +76,7 @@ class ForwardedHeaderTransformerTests {
void forwardedHeader() {
HttpHeaders headers = new HttpHeaders();
headers.add("Forwarded", "host=84.198.58.199;proto=https");
- ServerHttpRequest request = this.requestMutator.apply(getRequest(headers));
+ ServerHttpRequest request = new ForwardedHeaderTransformer(true).apply(getRequest(headers));
assertThat(request.getURI()).isEqualTo(URI.create("https://84.198.58.199/path"));
assertForwardedHeadersRemoved(request);
@@ -85,7 +86,9 @@ class ForwardedHeaderTransformerTests {
void xForwardedPrefix() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Forwarded-Prefix", "/prefix");
- ServerHttpRequest request = this.requestMutator.apply(getRequest(headers));
+ ForwardedHeaderTransformer transformer = new ForwardedHeaderTransformer(false);
+ transformer.setUseForwardedPrefix(true);
+ ServerHttpRequest request = transformer.apply(getRequest(headers));
assertThat(request.getURI()).isEqualTo(URI.create("https://example.com/prefix/path"));
assertThat(request.getPath().value()).isEqualTo("/prefix/path");
@@ -101,7 +104,9 @@ class ForwardedHeaderTransformerTests {
.headers(headers)
.build();
- request = this.requestMutator.apply(request);
+ ForwardedHeaderTransformer transformer = new ForwardedHeaderTransformer(false);
+ transformer.setUseForwardedPrefix(true);
+ request = transformer.apply(request);
assertThat(request.getURI()).isEqualTo(URI.create("https://example.com/prefix/a%20b?q=a%2Bb"));
assertThat(request.getPath().value()).isEqualTo("/prefix/a%20b");
@@ -112,7 +117,9 @@ class ForwardedHeaderTransformerTests {
void xForwardedPrefixTrailingSlash() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Forwarded-Prefix", "/prefix////");
- ServerHttpRequest request = this.requestMutator.apply(getRequest(headers));
+ ForwardedHeaderTransformer transformer = new ForwardedHeaderTransformer(false);
+ transformer.setUseForwardedPrefix(true);
+ ServerHttpRequest request = transformer.apply(getRequest(headers));
assertThat(request.getURI()).isEqualTo(URI.create("https://example.com/prefix/path"));
assertThat(request.getPath().value()).isEqualTo("/prefix/path");
@@ -129,7 +136,7 @@ class ForwardedHeaderTransformerTests {
.headers(headers)
.build();
- request = this.requestMutator.apply(request);
+ request = new ForwardedHeaderTransformer(true).apply(request);
assertThat(request.getURI()).isEqualTo(URI.create("https://84.198.58.199/a%20b?q=a%2Bb"));
assertForwardedHeadersRemoved(request);
@@ -144,7 +151,7 @@ class ForwardedHeaderTransformerTests {
.headers(headers)
.build();
- request = this.requestMutator.apply(request);
+ request = new ForwardedHeaderTransformer(true).apply(request);
assertThat(request.getURI()).isEqualTo(URI.create("https://84.198.58.199/a?q=1+1=2"));
assertForwardedHeadersRemoved(request);
@@ -154,7 +161,9 @@ class ForwardedHeaderTransformerTests {
void shouldConcatenatePrefixes() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Forwarded-Prefix", "/first,/second");
- ServerHttpRequest request = this.requestMutator.apply(getRequest(headers));
+ ForwardedHeaderTransformer transformer = new ForwardedHeaderTransformer(false);
+ transformer.setUseForwardedPrefix(true);
+ ServerHttpRequest request = transformer.apply(getRequest(headers));
assertThat(request.getURI()).isEqualTo(URI.create("https://example.com/first/second/path"));
assertThat(request.getPath().value()).isEqualTo("/first/second/path");
@@ -165,7 +174,9 @@ class ForwardedHeaderTransformerTests {
void shouldConcatenatePrefixesWithTrailingSlashes() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Forwarded-Prefix", "/first/,/second//");
- ServerHttpRequest request = this.requestMutator.apply(getRequest(headers));
+ ForwardedHeaderTransformer transformer = new ForwardedHeaderTransformer(false);
+ transformer.setUseForwardedPrefix(true);
+ ServerHttpRequest request = transformer.apply(getRequest(headers));
assertThat(request.getURI()).isEqualTo(URI.create("https://example.com/first/second/path"));
assertThat(request.getPath().value()).isEqualTo("/first/second/path");
@@ -176,7 +187,9 @@ class ForwardedHeaderTransformerTests {
void shouldRemoveSingleTrailingSlash() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-Forwarded-Prefix", "/prefix,/");
- ServerHttpRequest request = this.requestMutator.apply(getRequest(headers));
+ ForwardedHeaderTransformer transformer = new ForwardedHeaderTransformer(false);
+ transformer.setUseForwardedPrefix(true);
+ ServerHttpRequest request = transformer.apply(getRequest(headers));
assertThat(request.getURI()).isEqualTo(URI.create("https://example.com/prefix/path"));
assertThat(request.getPath().value()).isEqualTo("/prefix/path");
@@ -196,7 +209,7 @@ class ForwardedHeaderTransformerTests {
.headers(headers)
.build();
- request = this.requestMutator.apply(request);
+ request = new ForwardedHeaderTransformer(true).apply(request);
assertThat(request.getRemoteAddress()).isEqualTo(remoteAddress);
}
@@ -213,7 +226,7 @@ class ForwardedHeaderTransformerTests {
.headers(headers)
.build();
- request = this.requestMutator.apply(request);
+ request = new ForwardedHeaderTransformer(true).apply(request);
assertThat(request.getRemoteAddress()).isNotNull();
assertThat(request.getRemoteAddress().getHostName()).isEqualTo("203.0.113.195");
assertThat(request.getRemoteAddress().getPort()).isEqualTo(4711);
@@ -229,7 +242,7 @@ class ForwardedHeaderTransformerTests {
.headers(headers)
.build();
- request = this.requestMutator.apply(request);
+ request = new ForwardedHeaderTransformer(false).apply(request);
assertThat(request.getRemoteAddress()).isNotNull();
assertThat(request.getRemoteAddress().getHostName()).isEqualTo("203.0.113.195");
}
@@ -247,7 +260,7 @@ class ForwardedHeaderTransformerTests {
.headers(headers)
.build();
- request = this.requestMutator.apply(request);
+ request = new ForwardedHeaderTransformer(true).apply(request);
assertThat(request.getLocalAddress()).isNotNull();
assertThat(request.getLocalAddress().getHostName()).isEqualTo("203.0.113.195");
assertThat(request.getLocalAddress().getPort()).isEqualTo(4711);
diff --git a/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java b/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java
index e009db6998f..13f94925054 100644
--- a/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java
+++ b/spring-web/src/test/java/org/springframework/web/server/adapter/WebHttpHandlerBuilderTests.java
@@ -316,7 +316,7 @@ class WebHttpHandlerBuilderTests {
@Bean
public ForwardedHeaderTransformer forwardedHeaderTransformer() {
- return new ForwardedHeaderTransformer();
+ return new ForwardedHeaderTransformer(true);
}
@Bean
diff --git a/spring-web/src/test/java/org/springframework/web/util/ForwardedHeaderUtilsTests.java b/spring-web/src/test/java/org/springframework/web/util/ForwardedHeaderUtilsTests.java
index 71b03dce773..8783489bf8c 100644
--- a/spring-web/src/test/java/org/springframework/web/util/ForwardedHeaderUtilsTests.java
+++ b/spring-web/src/test/java/org/springframework/web/util/ForwardedHeaderUtilsTests.java
@@ -531,7 +531,7 @@ class ForwardedHeaderUtilsTests {
HttpRequest httpRequest = new ServletServerHttpRequest(request);
ForwardedHeaderUtils.ForwardedInfo info =
- ForwardedHeaderUtils.parseForwardedHeader(httpRequest.getURI(), httpRequest.getHeaders(), null, null);
+ ForwardedHeaderUtils.parseStandardHeader(httpRequest.getURI(), httpRequest.getHeaders(), null, null);
assertThat(info.forAddress()).isNotNull();
assertThat(info.forAddress().getHostString()).isEqualTo("192.0.2.0");
@@ -559,7 +559,7 @@ class ForwardedHeaderUtilsTests {
HttpHeaders headers = new HttpHeaders();
headers.add("Forwarded", "by=[fd00:fefe:1::4], 192.168.0.1");
- InetSocketAddress address = ForwardedHeaderUtils.parseForwardedHeader(
+ InetSocketAddress address = ForwardedHeaderUtils.parseStandardHeader(
URI.create("https://example.com"), headers, null, null).byAddress();
assertThat(address.getHostName()).isEqualTo("[fd00:fefe:1::4]");
@@ -567,7 +567,7 @@ class ForwardedHeaderUtilsTests {
private static UriComponents adaptFromForwardedHeader(URI uri, HttpHeaders headers) {
- return ForwardedHeaderUtils.parseForwardedHeader(uri, headers, null, null)
+ return ForwardedHeaderUtils.parseStandardHeader(uri, headers, null, null)
.uriComponentsBuilder().build();
}
diff --git a/spring-web/src/test/java/org/springframework/web/util/WebUtilsTests.java b/spring-web/src/test/java/org/springframework/web/util/WebUtilsTests.java
index 300bd9ea110..69fce2fe9bf 100644
--- a/spring-web/src/test/java/org/springframework/web/util/WebUtilsTests.java
+++ b/spring-web/src/test/java/org/springframework/web/util/WebUtilsTests.java
@@ -219,7 +219,7 @@ class WebUtilsTests {
}
request.addHeader(HttpHeaders.ORIGIN, originHeader);
- HttpServletRequest requestToUse = adaptFromForwardedHeaders(request);
+ HttpServletRequest requestToUse = adaptFromForwardedHeaders(request, false);
ServerHttpRequest httpRequest = new ServletServerHttpRequest(requestToUse);
assertThat(WebUtils.isSameOrigin(httpRequest)).isTrue();
@@ -236,16 +236,18 @@ class WebUtilsTests {
request.addHeader("Forwarded", forwardedHeader);
request.addHeader(HttpHeaders.ORIGIN, originHeader);
- HttpServletRequest requestToUse = adaptFromForwardedHeaders(request);
+ HttpServletRequest requestToUse = adaptFromForwardedHeaders(request, true);
ServerHttpRequest httpRequest = new ServletServerHttpRequest(requestToUse);
assertThat(WebUtils.isSameOrigin(httpRequest)).isTrue();
}
// SPR-16668
- private HttpServletRequest adaptFromForwardedHeaders(HttpServletRequest request) throws Exception {
+ private HttpServletRequest adaptFromForwardedHeaders(
+ HttpServletRequest request, boolean useStandardForwardedHeader) throws Exception {
+
MockFilterChain chain = new MockFilterChain();
- new ForwardedHeaderFilter().doFilter(request, new MockHttpServletResponse(), chain);
+ new ForwardedHeaderFilter(useStandardForwardedHeader).doFilter(request, new MockHttpServletResponse(), chain);
return (HttpServletRequest) chain.getRequest();
}
diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingIntegrationTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingIntegrationTests.java
index e50be4a9942..ed58e77d313 100644
--- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingIntegrationTests.java
+++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingIntegrationTests.java
@@ -148,7 +148,7 @@ class RequestMappingIntegrationTests extends AbstractRequestMappingIntegrationTe
@Bean
public ForwardedHeaderTransformer forwardedHeaderTransformer() {
- return new ForwardedHeaderTransformer();
+ return new ForwardedHeaderTransformer(true);
}
}
diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java
index e7582d619a2..2a34c893d50 100644
--- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java
+++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java
@@ -210,7 +210,7 @@ class MvcUriComponentsBuilderTests {
// SPR-16668
private void adaptRequestFromForwardedHeaders() throws Exception {
MockFilterChain chain = new MockFilterChain();
- new ForwardedHeaderFilter().doFilter(this.request, new MockHttpServletResponse(), chain);
+ new ForwardedHeaderFilter(false).doFilter(this.request, new MockHttpServletResponse(), chain);
HttpServletRequest adaptedRequest = (HttpServletRequest) chain.getRequest();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(adaptedRequest));
}
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 2c981e47fad..2ba143c9999 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
@@ -219,7 +219,9 @@ class ServletUriComponentsBuilderTests {
// SPR-16668
private HttpServletRequest adaptFromForwardedHeaders(HttpServletRequest request) throws Exception {
MockFilterChain chain = new MockFilterChain();
- new ForwardedHeaderFilter().doFilter(request, new MockHttpServletResponse(), chain);
+ ForwardedHeaderFilter filter = new ForwardedHeaderFilter(false);
+ filter.setUseForwardedPrefix(true);
+ filter.doFilter(request, new MockHttpServletResponse(), chain);
return (HttpServletRequest) chain.getRequest();
}