Merge multipart and query param values

DefaultMultipartHttpServletRequest always returned mulitpart parameter
values only rather than aggregating with query parameters, which
contradicts with Servlet spec, section 3.1, and is inconsistent with
StandardMultipartHttpServletRequest.

Issue: SPR-16590
This commit is contained in:
Rossen Stoyanchev
2018-05-13 21:39:18 -04:00
parent 23001a6c3d
commit ab6a6f4e17
2 changed files with 113 additions and 16 deletions

View File

@@ -16,10 +16,13 @@
package org.springframework.web.multipart.support;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
@@ -27,6 +30,7 @@ import javax.servlet.http.HttpServletRequest;
import org.springframework.http.HttpHeaders;
import org.springframework.lang.Nullable;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
/**
@@ -90,11 +94,20 @@ public class DefaultMultipartHttpServletRequest extends AbstractMultipartHttpSer
@Override
public String[] getParameterValues(String name) {
String[] values = getMultipartParameters().get(name);
if (values != null) {
return values;
String[] parameterValues = super.getParameterValues(name);
String[] mpValues = getMultipartParameters().get(name);
if (mpValues == null) {
return parameterValues;
}
if (parameterValues == null || getQueryString() == null) {
return mpValues;
}
else {
String[] result = new String[mpValues.length + parameterValues.length];
System.arraycopy(mpValues, 0, result, 0, mpValues.length);
System.arraycopy(parameterValues, 0, result, mpValues.length, parameterValues.length);
return result;
}
return super.getParameterValues(name);
}
@Override
@@ -105,25 +118,20 @@ public class DefaultMultipartHttpServletRequest extends AbstractMultipartHttpSer
}
Set<String> paramNames = new LinkedHashSet<>();
Enumeration<String> paramEnum = super.getParameterNames();
while (paramEnum.hasMoreElements()) {
paramNames.add(paramEnum.nextElement());
}
paramNames.addAll(Collections.list(super.getParameterNames()));
paramNames.addAll(multipartParameters.keySet());
return Collections.enumeration(paramNames);
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> multipartParameters = getMultipartParameters();
if (multipartParameters.isEmpty()) {
return super.getParameterMap();
Map<String, String[]> result = new LinkedHashMap<>();
Enumeration<String> names = getParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
result.put(name, getParameterValues(name));
}
Map<String, String[]> paramMap = new LinkedHashMap<>();
paramMap.putAll(super.getParameterMap());
paramMap.putAll(multipartParameters);
return paramMap;
return result;
}
@Override