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 0917538c06b..b477d9988bf 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 @@ -69,7 +69,12 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter { } - private final UrlPathHelper pathHelper = new UrlPathHelper(); + private final UrlPathHelper pathHelper; + + public ForwardedHeaderFilter() { + this.pathHelper = new UrlPathHelper(); + this.pathHelper.setUrlDecode(false); + } @Override 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 4b58ef5d1e8..ec7f7ba0b5a 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 @@ -108,6 +108,18 @@ public class ForwardedHeaderFilterTests { assertEquals("", actual.getContextPath()); assertEquals("/path/", actual.getRequestURI()); } + + @Test + public void requestUriPreserveEncoding() throws Exception { + this.request.setContextPath("/app"); + this.request.setRequestURI("/app/path%20with%20spaces/"); + HttpServletRequest actual = filterAndGetWrappedRequest(); + + assertEquals("/app", actual.getContextPath()); + assertEquals("/app/path%20with%20spaces/", actual.getRequestURI()); + assertEquals("http://localhost/app/path%20with%20spaces/", actual.getRequestURL().toString()); + } + @Test public void requestUriEqualsContextPath() throws Exception { this.request.addHeader(X_FORWARDED_PREFIX, "/");