Skip to content

Commit 58cfb52

Browse files
author
Dennis Kieselhorst
authored
Merge pull request #446 from deki/340-emptyFormParams
Form param handling fixes
2 parents fee7a6d + 0288c48 commit 58cfb52

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -496,14 +496,16 @@ protected Map<String, List<String>> getFormUrlEncodedParametersMap() {
496496
urlEncodedFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
497497
for (String parameter : rawBodyContent.split(FORM_DATA_SEPARATOR)) {
498498
String[] parameterKeyValue = parameter.split(HEADER_KEY_VALUE_SEPARATOR);
499-
if (parameterKeyValue.length < 2) {
499+
if (parameterKeyValue.length < 1) {
500500
continue;
501501
}
502502
List<String> values = new ArrayList<>();
503503
if (urlEncodedFormParameters.containsKey(parameterKeyValue[0])) {
504504
values = urlEncodedFormParameters.get(parameterKeyValue[0]);
505505
}
506-
values.add(decodeValueIfEncoded(parameterKeyValue[1]));
506+
if (parameterKeyValue.length > 1) {
507+
values.add(decodeValueIfEncoded(parameterKeyValue[1]));
508+
}
507509
urlEncodedFormParameters.put(decodeValueIfEncoded(parameterKeyValue[0]), values);
508510
}
509511
Timer.stop("SERVLET_REQUEST_GET_FORM_PARAMS");

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
import java.util.List;
4646
import java.util.Locale;
4747
import java.util.Map;
48+
import java.util.Set;
49+
import java.util.stream.Collectors;
50+
import java.util.stream.Stream;
4851

4952

5053
/**
@@ -360,11 +363,12 @@ public String getParameter(String s) {
360363

361364
@Override
362365
public Enumeration<String> getParameterNames() {
366+
Set<String> formParameterNames = getFormUrlEncodedParametersMap().keySet();
363367
if (request.getMultiValueQueryStringParameters() == null) {
364-
return Collections.emptyEnumeration();
368+
return Collections.enumeration(formParameterNames);
365369
}
366-
367-
return Collections.enumeration(request.getMultiValueQueryStringParameters().keySet());
370+
return Collections.enumeration(Stream.concat(formParameterNames.stream(),
371+
request.getMultiValueQueryStringParameters().keySet().stream()).collect(Collectors.toSet()));
368372
}
369373

370374

aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
import java.io.IOException;
1919
import java.nio.charset.Charset;
2020
import java.util.Base64;
21+
import java.util.Collections;
2122
import java.util.Map;
2223
import java.util.Random;
2324

2425
import static org.junit.Assert.assertEquals;
2526
import static org.junit.Assert.assertNotNull;
27+
import static org.junit.Assert.assertTrue;
2628
import static org.junit.Assert.fail;
2729

2830

@@ -121,6 +123,25 @@ public void postForm_getParamsBase64Encoded_expectAllParams() {
121123
Map<String, String[]> params = request.getParameterMap();
122124
assertNotNull(params);
123125
assertEquals(2, params.size());
124-
assertEquals(true, params.containsKey(PART_KEY_1));
126+
assertTrue(params.containsKey(PART_KEY_1));
127+
assertEquals(2, Collections.list(request.getParameterNames()).size());
128+
}
129+
130+
/**
131+
* issue #340
132+
*/
133+
@Test
134+
public void postForm_emptyParamPresent() {
135+
AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST")
136+
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED).build();
137+
String body = PART_KEY_1 + "=" + "&" + PART_KEY_2 + "=" + PART_VALUE_2;
138+
proxyRequest.setBody(body);
139+
140+
HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null);
141+
Map<String, String[]> params = request.getParameterMap();
142+
assertNotNull(params);
143+
assertEquals(2, params.size());
144+
assertTrue(params.containsKey(PART_KEY_1));
145+
assertEquals(2, Collections.list(request.getParameterNames()).size());
125146
}
126147
}

0 commit comments

Comments
 (0)