Skip to content

Commit 8176641

Browse files
committed
fix: Request Parameters not picked up for v1 payload format with multivalue headers enabled (#1256)
1 parent 5f02ec1 commit 8176641

File tree

2 files changed

+47
-12
lines changed

2 files changed

+47
-12
lines changed

aws-serverless-java-container-springboot3/src/main/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtils.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
import java.nio.charset.StandardCharsets;
66
import java.nio.charset.UnsupportedCharsetException;
77
import java.util.Base64;
8+
import java.util.List;
89
import java.util.Map;
910
import java.util.Map.Entry;
1011
import java.util.concurrent.CountDownLatch;
1112
import java.util.concurrent.TimeUnit;
13+
import java.util.function.BiConsumer;
1214

1315
import com.amazonaws.serverless.proxy.internal.HttpUtils;
1416
import org.apache.commons.io.Charsets;
@@ -118,7 +120,11 @@ private static HttpServletRequest generateRequest1(String request, Context lambd
118120

119121
ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext, v1Request.getHttpMethod(), v1Request.getPath());
120122

121-
populateQueryStringparameters(v1Request.getQueryStringParameters(), httpRequest);
123+
populateQueryStringParameters(v1Request.getQueryStringParameters(), httpRequest);
124+
if (v1Request.getMultiValueQueryStringParameters() != null) {
125+
MultiValueMapAdapter<String, String> queryStringParameters = new MultiValueMapAdapter(v1Request.getMultiValueQueryStringParameters());
126+
queryStringParameters.forEach((k, v) -> httpRequest.setParameter(k, StringUtils.collectionToCommaDelimitedString(v)));
127+
}
122128

123129
if (v1Request.getMultiValueHeaders() != null) {
124130
MultiValueMapAdapter headers = new MultiValueMapAdapter(v1Request.getMultiValueHeaders());
@@ -152,7 +158,7 @@ private static HttpServletRequest generateRequest2(String request, Context lambd
152158

153159
ServerlessHttpServletRequest httpRequest = new ServerlessHttpServletRequest(servletContext,
154160
v2Request.getRequestContext().getHttp().getMethod(), v2Request.getRequestContext().getHttp().getPath());
155-
populateQueryStringparameters(v2Request.getQueryStringParameters(), httpRequest);
161+
populateQueryStringParameters(v2Request.getQueryStringParameters(), httpRequest);
156162

157163
v2Request.getHeaders().forEach(httpRequest::setHeader);
158164

@@ -172,7 +178,7 @@ private static HttpServletRequest generateRequest2(String request, Context lambd
172178
return httpRequest;
173179
}
174180

175-
private static void populateQueryStringparameters(Map<String, String> requestParameters, ServerlessHttpServletRequest httpRequest) {
181+
private static void populateQueryStringParameters(Map<String, String> requestParameters, ServerlessHttpServletRequest httpRequest) {
176182
if (!CollectionUtils.isEmpty(requestParameters)) {
177183
for (Entry<String, String> entry : requestParameters.entrySet()) {
178184
httpRequest.setParameter(entry.getKey(), entry.getValue());

aws-serverless-java-container-springboot3/src/test/java/com/amazonaws/serverless/proxy/spring/AwsSpringHttpProcessingUtilsTests.java

+38-9
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ public class AwsSpringHttpProcessingUtilsTests {
7979
+ " },\n"
8080
+ " \"queryStringParameters\": {\n"
8181
+ " \"abc\": \"xyz\",\n"
82-
+ " \"foo\": \"baz\"\n"
82+
+ " \"parameter1\": \"value2\"\n"
8383
+ " },\n"
8484
+ " \"multiValueQueryStringParameters\": {\n"
8585
+ " \"abc\": [\n"
8686
+ " \"xyz\"\n"
8787
+ " ],\n"
88-
+ " \"foo\": [\n"
89-
+ " \"bar\",\n"
90-
+ " \"baz\"\n"
88+
+ " \"parameter1\": [\n"
89+
+ " \"value1\",\n"
90+
+ " \"value2\"\n"
9191
+ " ]\n"
9292
+ " },\n"
9393
+ " \"requestContext\": {\n"
@@ -184,10 +184,35 @@ public class AwsSpringHttpProcessingUtilsTests {
184184
" }\n" +
185185
"}";
186186

187+
private static final String ALB_EVENT = "{\n" +
188+
" \"requestContext\": {\n" +
189+
" \"elb\": {\n" +
190+
" \"targetGroupArn\": \"arn:aws:elasticloadbalancing:region:123456789012:targetgroup/my-target-group/6d0ecf831eec9f09\"\n" +
191+
" }\n" +
192+
" },\n" +
193+
" \"httpMethod\": \"POST\",\n" +
194+
" \"path\": \"/async\",\n" +
195+
" \"multiValueQueryStringParameters\": { \"parameter1\": [\"value1\", \"value2\"]},\n" +
196+
" \"multiValueHeaders\": {\n" +
197+
" \"accept\": [\"text/html,application/xhtml+xml\"],\n" +
198+
" \"accept-language\": [\"en-US,en;q=0.8\"],\n" +
199+
" \"content-type\": [\"text/plain\"],\n" +
200+
" \"cookie\": [\"cookies\"],\n" +
201+
" \"host\": [\"lambda-846800462-us-east-2.elb.amazonaws.com\"],\n" +
202+
" \"User-Agent\": [\"curl/7.79.1\"],\n" +
203+
" \"x-amzn-trace-id\": [\"Root=1-5bdb40ca-556d8b0c50dc66f0511bf520\"],\n" +
204+
" \"x-forwarded-for\": [\"72.21.198.66\"],\n" +
205+
" \"x-forwarded-port\": [\"443\"],\n" +
206+
" \"x-forwarded-proto\": [\"https\"]\n" +
207+
" },\n" +
208+
" \"isBase64Encoded\": false,\n" +
209+
" \"body\": \"request_body\"\n" +
210+
"}";
211+
187212
private final ObjectMapper mapper = new ObjectMapper();
188213

189214
public static Collection<String> data() {
190-
return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2});
215+
return Arrays.asList(new String[]{API_GATEWAY_EVENT, API_GATEWAY_EVENT_V2, ALB_EVENT});
191216
}
192217

193218
@MethodSource("data")
@@ -197,10 +222,17 @@ public void validateHttpServletRequestGenerationWithInputStream(String jsonEvent
197222
ServerlessServletContext servletContext = new ServerlessServletContext();
198223
HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(inputStream, null, servletContext, mapper);
199224
// spot check some headers
225+
assertRequest(request);
226+
}
227+
228+
private static void assertRequest(HttpServletRequest request) {
200229
assertEquals("curl/7.79.1", request.getHeader("User-Agent"));
201230
assertEquals("443", request.getHeader("X-Forwarded-Port"));
202231
assertEquals("POST", request.getMethod());
203232
assertEquals("/async", request.getRequestURI());
233+
assertEquals("value1,value2", request.getParameter("parameter1"));
234+
// to be fixed: assertArrayEquals(new String[]{"value1","value2"}, request.getParameterValues("parameter1"));
235+
204236
}
205237

206238
@MethodSource("data")
@@ -209,10 +241,7 @@ public void validateHttpServletRequestGenerationWithJson(String jsonEvent) {
209241
ServerlessServletContext servletContext = new ServerlessServletContext();
210242
HttpServletRequest request = AwsSpringHttpProcessingUtils.generateHttpServletRequest(jsonEvent, null, servletContext, mapper);
211243
// spot check some headers
212-
assertEquals("curl/7.79.1", request.getHeader("User-Agent"));
213-
assertEquals("443", request.getHeader("X-Forwarded-Port"));
214-
assertEquals("POST", request.getMethod());
215-
assertEquals("/async", request.getRequestURI());
244+
assertRequest(request);
216245
}
217246

218247
@MethodSource("data")

0 commit comments

Comments
 (0)