in aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java [569:618]
protected Map<String, String[]> generateParameterMap(MultiValuedTreeMap<String, String> qs, ContainerConfig config, boolean decodeQueryParams) {
Map<String, String[]> output;
Map<String, List<String>> formEncodedParams = getFormUrlEncodedParametersMap();
if (qs == null) {
// Just transform the List<String> values to String[]
return formEncodedParams.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, (e) -> e.getValue().toArray(new String[0])));
}
// decode all keys and values in map
final MultiValuedTreeMap<String, String> decodedQs = new MultiValuedTreeMap<String, String>();
if (decodeQueryParams) {
for (Map.Entry<String, List<String>> entry : qs.entrySet()) {
String k = decodeValueIfEncoded(entry.getKey());
List<String> v = getQueryParamValuesAsList(qs, entry.getKey(), false).stream()
.map(AwsHttpServletRequest::decodeValueIfEncoded)
.collect(Collectors.toList());
// addAll in case map has 2 keys that are identical once decoded
decodedQs.addAll(k, v);
}
} else {
decodedQs.putAll(qs);
}
Map<String, List<String>> queryStringParams;
if (config.isQueryStringCaseSensitive()) {
queryStringParams = decodedQs;
} else {
// If it's case insensitive, we check the entire map on every parameter
queryStringParams = decodedQs.entrySet().stream().collect(
Collectors.toMap(
Map.Entry::getKey,
e -> getQueryParamValuesAsList(decodedQs, e.getKey(), false)
));
}
// Merge formEncodedParams and queryStringParams Maps
output = Stream.of(formEncodedParams, queryStringParams).flatMap(m -> m.entrySet().stream())
.collect(
Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().toArray(new String[0]),
// If a parameter is in both Maps, we merge the list of values (and ultimately transform to String[])
(formParam, queryParam) -> Stream.of(formParam, queryParam).flatMap(Stream::of).toArray(String[]::new)
));
return output;
}