diff --git a/spring-web/src/main/java/org/springframework/web/filter/HttpPutFormContentFilter.java b/spring-web/src/main/java/org/springframework/web/filter/HttpPutFormContentFilter.java index 0768f05dc69..c6bd492ef24 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/HttpPutFormContentFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/HttpPutFormContentFilter.java @@ -98,12 +98,14 @@ public class HttpPutFormContentFilter extends OncePerRequestFilter { } }; MultiValueMap formParameters = this.formConverter.read(null, inputMessage); - HttpServletRequest wrapper = new HttpPutFormContentRequestWrapper(request, formParameters); - filterChain.doFilter(wrapper, response); - } - else { - filterChain.doFilter(request, response); + if (!formParameters.isEmpty()) { + HttpServletRequest wrapper = new HttpPutFormContentRequestWrapper(request, formParameters); + filterChain.doFilter(wrapper, response); + return; + } } + + filterChain.doFilter(request, response); } private boolean isFormContentType(HttpServletRequest request) { @@ -162,17 +164,17 @@ public class HttpPutFormContentFilter extends OncePerRequestFilter { @Override @Nullable public String[] getParameterValues(String name) { - String[] queryParam = (super.getQueryString() != null ? super.getParameterValues(name) : null); + String[] parameterValues = super.getParameterValues(name); List formParam = this.formParameters.get(name); if (formParam == null) { - return queryParam; + return parameterValues; } - else if (queryParam == null) { + if (parameterValues == null || getQueryString() == null) { return formParam.toArray(new String[formParam.size()]); } else { - List result = new ArrayList<>(queryParam.length + formParam.size()); - result.addAll(Arrays.asList(queryParam)); + List result = new ArrayList<>(parameterValues.length + formParam.size()); + result.addAll(Arrays.asList(parameterValues)); result.addAll(formParam); return result.toArray(new String[result.size()]); } diff --git a/spring-web/src/test/java/org/springframework/web/filter/HttpPutFormContentFilterTests.java b/spring-web/src/test/java/org/springframework/web/filter/HttpPutFormContentFilterTests.java index 6a5de837ddd..07758e96fb4 100644 --- a/spring-web/src/test/java/org/springframework/web/filter/HttpPutFormContentFilterTests.java +++ b/spring-web/src/test/java/org/springframework/web/filter/HttpPutFormContentFilterTests.java @@ -58,7 +58,7 @@ public class HttpPutFormContentFilterTests { @Test public void wrapPutAndPatchOnly() throws Exception { - request.setContent("".getBytes("ISO-8859-1")); + request.setContent("foo=bar".getBytes("ISO-8859-1")); for (HttpMethod method : HttpMethod.values()) { request.setMethod(method.name()); filterChain = new MockFilterChain(); @@ -204,4 +204,13 @@ public class HttpPutFormContentFilterTests { assertArrayEquals(new String[] {"value4"}, parameters.get("name4")); } + @Test // SPR-15835 + public void hiddenHttpMethodFilterFollowedByHttpPutFormContentFilter() throws Exception { + request.addParameter("_method", "PUT"); + request.addParameter("hiddenField", "testHidden"); + filter.doFilter(request, response, filterChain); + + assertArrayEquals(new String[]{"testHidden"}, filterChain.getRequest().getParameterValues("hiddenField")); + } + }