Skip to content

Commit 69b1e9f

Browse files
committed
Change parameter transformation logic
1 parent 3c55f62 commit 69b1e9f

File tree

1 file changed

+38
-18
lines changed

1 file changed

+38
-18
lines changed

aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
import java.nio.charset.StandardCharsets;
4545
import java.time.format.DateTimeFormatter;
4646
import java.util.*;
47+
import java.util.stream.Collectors;
48+
import java.util.stream.Stream;
4749

4850

4951
/**
@@ -546,39 +548,57 @@ protected Map<String, Part> getMultipartFormParametersMap() {
546548
}
547549

548550
protected String[] getQueryParamValues(MultiValuedTreeMap<String, String> qs, String key, boolean isCaseSensitive) {
551+
return getQueryParamValuesAsList(qs, key, isCaseSensitive).toArray(new String[0]);
552+
}
553+
554+
protected List<String> getQueryParamValuesAsList(MultiValuedTreeMap<String, String> qs, String key, boolean isCaseSensitive) {
549555
if (qs != null) {
550556
if (isCaseSensitive) {
551-
return qs.get(key).toArray(new String[0]);
557+
return qs.get(key);
552558
}
553559

554560
for (String k : qs.keySet()) {
555561
if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) {
556-
return qs.get(k).toArray(new String[0]);
562+
return qs.get(k);
557563
}
558564
}
559565
}
560566

561-
return new String[0];
567+
return new ArrayList<String>();
562568
}
563569

564570
protected Map<String, String[]> generateParameterMap(MultiValuedTreeMap<String, String> qs, ContainerConfig config) {
565-
Map<String, String[]> output = new HashMap<>();
571+
Map<String, String[]> output;
566572

567-
Map<String, List<String>> params = getFormUrlEncodedParametersMap();
568-
params.entrySet().stream().parallel().forEach(e -> {
569-
output.put(e.getKey(), e.getValue().toArray(new String[0]));
570-
});
573+
Map<String, List<String>> formEncodedParams = getFormUrlEncodedParametersMap();
574+
575+
if (qs == null) {
576+
// Just transform the List<String> values to String[]
577+
output = formEncodedParams.entrySet().stream()
578+
.collect(Collectors.toMap(Map.Entry::getKey, (e) -> e.getValue().toArray(new String[0])));
579+
} else {
580+
Map<String, List<String>> queryStringParams;
581+
if (config.isQueryStringCaseSensitive()) {
582+
queryStringParams = qs;
583+
} else {
584+
// If it's case insensitive, we check the entire map on every parameter
585+
queryStringParams = qs.entrySet().stream().parallel().collect(
586+
Collectors.toMap(
587+
Map.Entry::getKey,
588+
e -> getQueryParamValuesAsList(qs, e.getKey(), false)
589+
));
590+
}
591+
592+
// Merge formEncodedParams and queryStringParams Maps
593+
output = Stream.of(formEncodedParams, queryStringParams).flatMap(m -> m.entrySet().stream())
594+
.collect(
595+
Collectors.toMap(
596+
Map.Entry::getKey,
597+
e -> e.getValue().toArray(new String[0]),
598+
// If a parameter is in both Maps, we merge the list of values (and ultimately transform to String[])
599+
(formParam, queryParam) -> Stream.of(formParam, queryParam).flatMap(Stream::of).toArray(String[]::new)
600+
));
571601

572-
if (qs != null) {
573-
qs.keySet().stream().parallel().forEach(e -> {
574-
List<String> newValues = new ArrayList<>();
575-
if (output.containsKey(e)) {
576-
String[] values = output.get(e);
577-
newValues.addAll(Arrays.asList(values));
578-
}
579-
newValues.addAll(Arrays.asList(getQueryParamValues(qs, e, config.isQueryStringCaseSensitive())));
580-
output.put(e, newValues.toArray(new String[0]));
581-
});
582602
}
583603

584604
return output;

0 commit comments

Comments
 (0)