Skip to content

Commit af83d23

Browse files
committed
Fix regression in HttpPutFormContentFilter
Re-arrange the checks so that if there is no form parameter, then immediately and unconditionally delegate to super.getParameterValues(). Or reversely if there is no super.getParameterValues() then return the form parameter. So the only remaining case is when combining values present in both. In that case we'll take both only if a queryString exists. One extra fix is to not even wrap the request if we did not parse any form parameters at all which can happen with HttpHiddenMethodFilter. Issue: SPR-15828, 15835
1 parent ce0bce2 commit af83d23

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

spring-web/src/main/java/org/springframework/web/filter/HttpPutFormContentFilter.java

+12-10
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,14 @@ public InputStream getBody() throws IOException {
9898
}
9999
};
100100
MultiValueMap<String, String> formParameters = this.formConverter.read(null, inputMessage);
101-
HttpServletRequest wrapper = new HttpPutFormContentRequestWrapper(request, formParameters);
102-
filterChain.doFilter(wrapper, response);
103-
}
104-
else {
105-
filterChain.doFilter(request, response);
101+
if (!formParameters.isEmpty()) {
102+
HttpServletRequest wrapper = new HttpPutFormContentRequestWrapper(request, formParameters);
103+
filterChain.doFilter(wrapper, response);
104+
return;
105+
}
106106
}
107+
108+
filterChain.doFilter(request, response);
107109
}
108110

109111
private boolean isFormContentType(HttpServletRequest request) {
@@ -162,17 +164,17 @@ public Enumeration<String> getParameterNames() {
162164
@Override
163165
@Nullable
164166
public String[] getParameterValues(String name) {
165-
String[] queryParam = (super.getQueryString() != null ? super.getParameterValues(name) : null);
167+
String[] parameterValues = super.getParameterValues(name);
166168
List<String> formParam = this.formParameters.get(name);
167169
if (formParam == null) {
168-
return queryParam;
170+
return parameterValues;
169171
}
170-
else if (queryParam == null) {
172+
if (parameterValues == null || getQueryString() == null) {
171173
return formParam.toArray(new String[formParam.size()]);
172174
}
173175
else {
174-
List<String> result = new ArrayList<>(queryParam.length + formParam.size());
175-
result.addAll(Arrays.asList(queryParam));
176+
List<String> result = new ArrayList<>(parameterValues.length + formParam.size());
177+
result.addAll(Arrays.asList(parameterValues));
176178
result.addAll(formParam);
177179
return result.toArray(new String[result.size()]);
178180
}

spring-web/src/test/java/org/springframework/web/filter/HttpPutFormContentFilterTests.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public void setup() {
5858

5959
@Test
6060
public void wrapPutAndPatchOnly() throws Exception {
61-
request.setContent("".getBytes("ISO-8859-1"));
61+
request.setContent("foo=bar".getBytes("ISO-8859-1"));
6262
for (HttpMethod method : HttpMethod.values()) {
6363
request.setMethod(method.name());
6464
filterChain = new MockFilterChain();
@@ -204,4 +204,13 @@ public void getParameterMap() throws Exception {
204204
assertArrayEquals(new String[] {"value4"}, parameters.get("name4"));
205205
}
206206

207+
@Test // SPR-15835
208+
public void hiddenHttpMethodFilterFollowedByHttpPutFormContentFilter() throws Exception {
209+
request.addParameter("_method", "PUT");
210+
request.addParameter("hiddenField", "testHidden");
211+
filter.doFilter(request, response, filterChain);
212+
213+
assertArrayEquals(new String[]{"testHidden"}, filterChain.getRequest().getParameterValues("hiddenField"));
214+
}
215+
207216
}

0 commit comments

Comments
 (0)