From 0c890e32df88db015a91bfdaf8f922a63d066494 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 3 Jan 2022 11:48:29 +0100 Subject: [PATCH 1/3] Empty form params should not be omitted (#340) --- .../internal/servlet/AwsHttpServletRequest.java | 6 ++++-- .../AwsProxyHttpServletRequestFormTest.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java index 8ea22653c..61d97bfef 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java @@ -496,14 +496,16 @@ protected Map> getFormUrlEncodedParametersMap() { urlEncodedFormParameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (String parameter : rawBodyContent.split(FORM_DATA_SEPARATOR)) { String[] parameterKeyValue = parameter.split(HEADER_KEY_VALUE_SEPARATOR); - if (parameterKeyValue.length < 2) { + if (parameterKeyValue.length < 1) { continue; } List values = new ArrayList<>(); if (urlEncodedFormParameters.containsKey(parameterKeyValue[0])) { values = urlEncodedFormParameters.get(parameterKeyValue[0]); } - values.add(decodeValueIfEncoded(parameterKeyValue[1])); + if (parameterKeyValue.length > 1) { + values.add(decodeValueIfEncoded(parameterKeyValue[1])); + } urlEncodedFormParameters.put(decodeValueIfEncoded(parameterKeyValue[0]), values); } Timer.stop("SERVLET_REQUEST_GET_FORM_PARAMS"); diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index b20982b7c..073f0dc89 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -123,4 +123,21 @@ public void postForm_getParamsBase64Encoded_expectAllParams() { assertEquals(2, params.size()); assertEquals(true, params.containsKey(PART_KEY_1)); } + + /** + * issue #340 + */ + @Test + public void postForm_emptyParamPresent() { + AwsProxyRequest proxyRequest = new AwsProxyRequestBuilder("/form", "POST") + .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED).build(); + String body = PART_KEY_1 + "=" + "&" + PART_KEY_2 + "=" + PART_VALUE_2; + proxyRequest.setBody(body); + + HttpServletRequest request = new AwsProxyHttpServletRequest(proxyRequest, null, null); + Map params = request.getParameterMap(); + assertNotNull(params); + assertEquals(2, params.size()); + assertEquals(true, params.containsKey(PART_KEY_1)); + } } From cab58173de425f6eae99f4cf61ced0cee744f7c7 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 3 Jan 2022 12:00:42 +0100 Subject: [PATCH 2/3] use assertTrue for boolean checks --- .../internal/servlet/AwsProxyHttpServletRequestFormTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index 073f0dc89..7663937bf 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -121,7 +122,7 @@ public void postForm_getParamsBase64Encoded_expectAllParams() { Map params = request.getParameterMap(); assertNotNull(params); assertEquals(2, params.size()); - assertEquals(true, params.containsKey(PART_KEY_1)); + assertTrue(params.containsKey(PART_KEY_1)); } /** @@ -138,6 +139,6 @@ public void postForm_emptyParamPresent() { Map params = request.getParameterMap(); assertNotNull(params); assertEquals(2, params.size()); - assertEquals(true, params.containsKey(PART_KEY_1)); + assertTrue(params.containsKey(PART_KEY_1)); } } From 0288c488b61c44e9a26a650d887fcecb980075a1 Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 3 Jan 2022 13:59:47 +0100 Subject: [PATCH 3/3] form param names must be included in getParameterNames() (#340) --- .../internal/servlet/AwsProxyHttpServletRequest.java | 10 +++++++--- .../servlet/AwsProxyHttpServletRequestFormTest.java | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 97ae055bd..eecda99cb 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -45,6 +45,9 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** @@ -360,11 +363,12 @@ public String getParameter(String s) { @Override public Enumeration getParameterNames() { + Set formParameterNames = getFormUrlEncodedParametersMap().keySet(); if (request.getMultiValueQueryStringParameters() == null) { - return Collections.emptyEnumeration(); + return Collections.enumeration(formParameterNames); } - - return Collections.enumeration(request.getMultiValueQueryStringParameters().keySet()); + return Collections.enumeration(Stream.concat(formParameterNames.stream(), + request.getMultiValueQueryStringParameters().keySet().stream()).collect(Collectors.toSet())); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java index 7663937bf..838ea6607 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestFormTest.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.Base64; +import java.util.Collections; import java.util.Map; import java.util.Random; @@ -123,6 +124,7 @@ public void postForm_getParamsBase64Encoded_expectAllParams() { assertNotNull(params); assertEquals(2, params.size()); assertTrue(params.containsKey(PART_KEY_1)); + assertEquals(2, Collections.list(request.getParameterNames()).size()); } /** @@ -140,5 +142,6 @@ public void postForm_emptyParamPresent() { assertNotNull(params); assertEquals(2, params.size()); assertTrue(params.containsKey(PART_KEY_1)); + assertEquals(2, Collections.list(request.getParameterNames()).size()); } }