From 9a9166622eb08e5445ae64daea7ada56fd735d41 Mon Sep 17 00:00:00 2001 From: Bryan Kelly Date: Fri, 7 Apr 2017 14:59:32 -0500 Subject: [PATCH] Fix ForwardedHeaderFilter getRequestURL() Previously ForwardedHeaderFilter would return the same StringBuffer for every invocation. This meant that users that modified the StringBuffer changed the state of the HttpServletRequest. This commit ensures that a new StringBuffer is always returned for ForwardedHeaderFilter. Issue: SPR-15423 --- .../web/filter/ForwardedHeaderFilter.java | 8 ++++---- .../web/filter/ForwardedHeaderFilterTests.java | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) 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 a2653b5de12..a087ebd0139 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 @@ -118,7 +118,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter { private final String requestUri; - private final StringBuffer requestUrl; + private final String requestUrl; private final Map> headers; @@ -137,8 +137,8 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter { String prefix = getForwardedPrefix(request); this.contextPath = (prefix != null ? prefix : request.getContextPath()); this.requestUri = this.contextPath + pathHelper.getPathWithinApplication(request); - this.requestUrl = new StringBuffer(this.scheme + "://" + this.host + - (port == -1 ? "" : ":" + port) + this.requestUri); + this.requestUrl = this.scheme + "://" + this.host + + (port == -1 ? "" : ":" + port) + this.requestUri; this.headers = initHeaders(request); } @@ -206,7 +206,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter { @Override public StringBuffer getRequestURL() { - return this.requestUrl; + return new StringBuffer(this.requestUrl); } // Override header accessors to not expose forwarded headers 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 b27a492bc53..3e461241491 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 @@ -204,6 +204,16 @@ public class ForwardedHeaderFilterTests { HttpServletRequest actual = filterAndGetWrappedRequest(); assertEquals("http://localhost/prefix/mvc-showcase", actual.getRequestURL().toString()); } + + @Test + public void requestURLNewStringBuffer() throws Exception { + this.request.addHeader(X_FORWARDED_PREFIX, "/prefix/"); + this.request.setRequestURI("/mvc-showcase"); + + HttpServletRequest actual = filterAndGetWrappedRequest(); + actual.getRequestURL().append("?key=value"); + assertEquals("http://localhost/prefix/mvc-showcase", actual.getRequestURL().toString()); + } @Test public void contextPathWithForwardedPrefix() throws Exception {