|
44 | 44 | import java.nio.charset.StandardCharsets;
|
45 | 45 | import java.time.format.DateTimeFormatter;
|
46 | 46 | import java.util.*;
|
| 47 | +import java.util.stream.Collectors; |
| 48 | +import java.util.stream.Stream; |
47 | 49 |
|
48 | 50 |
|
49 | 51 | /**
|
@@ -546,39 +548,57 @@ protected Map<String, Part> getMultipartFormParametersMap() {
|
546 | 548 | }
|
547 | 549 |
|
548 | 550 | 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) { |
549 | 555 | if (qs != null) {
|
550 | 556 | if (isCaseSensitive) {
|
551 |
| - return qs.get(key).toArray(new String[0]); |
| 557 | + return qs.get(key); |
552 | 558 | }
|
553 | 559 |
|
554 | 560 | for (String k : qs.keySet()) {
|
555 | 561 | if (k.toLowerCase(Locale.getDefault()).equals(key.toLowerCase(Locale.getDefault()))) {
|
556 |
| - return qs.get(k).toArray(new String[0]); |
| 562 | + return qs.get(k); |
557 | 563 | }
|
558 | 564 | }
|
559 | 565 | }
|
560 | 566 |
|
561 |
| - return new String[0]; |
| 567 | + return new ArrayList<String>(); |
562 | 568 | }
|
563 | 569 |
|
564 | 570 | protected Map<String, String[]> generateParameterMap(MultiValuedTreeMap<String, String> qs, ContainerConfig config) {
|
565 |
| - Map<String, String[]> output = new HashMap<>(); |
| 571 | + Map<String, String[]> output; |
566 | 572 |
|
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 | + )); |
571 | 601 |
|
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 |
| - }); |
582 | 602 | }
|
583 | 603 |
|
584 | 604 | return output;
|
|
0 commit comments