From 46cf4f9ba1624efb70069d092e9bcaabb5b25a45 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Mon, 10 Apr 2017 08:41:07 -0500 Subject: [PATCH] ForwardedHeaderFilter requestURI preserve encoding Previously ForwardedHeaderFilter would override the requestURI with a URL decoded value. This would cause problems when using a URL encoded requestURI since downstream Filters would not see the URL encoded value as they should. This commit resolves this issue by ensuring that the requestURI is properly encoded. Issues SPR-15422 --- .../web/filter/ForwardedHeaderFilter.java | 7 ++++++- .../web/filter/ForwardedHeaderFilterTests.java | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) 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, "/");