Skip to content

Commit f68e755

Browse files
committed
Add handling decoding of parameters for ALB requests and decode paramter names in HTTP API requests
1 parent 916f2a2 commit f68e755

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,10 +483,10 @@ private MultiValuedTreeMap<String, String> parseRawQueryString(String qs) {
483483

484484
String[] kv = value.split(QUERY_STRING_KEY_VALUE_SEPARATOR);
485485
String key = URLDecoder.decode(kv[0], LambdaContainerHandler.getContainerConfig().getUriEncoding());
486-
String val = kv.length == 2 ? kv[1] : "";
486+
String val = kv.length == 2 ? AwsHttpServletRequest.decodeValueIfEncoded(kv[1]) : "";
487487
qsMap.add(key, val);
488488
} catch (UnsupportedEncodingException e) {
489-
log.error("Unsupported encoding in query string key: " + SecurityUtils.crlf(value), e);
489+
log.error("Unsupported encoding in query string key-value pair: " + SecurityUtils.crlf(value), e);
490490
}
491491
}
492492
return qsMap;

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

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,17 @@ public String getContentType() {
325325

326326
@Override
327327
public String getParameter(String s) {
328+
329+
// decode key if ALB
330+
if (request.getRequestSource() == RequestSource.ALB) {
331+
s = decodeValueIfEncoded(s);
332+
}
333+
328334
String queryStringParameter = getFirstQueryParamValue(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive());
329335
if (queryStringParameter != null) {
336+
if (request.getRequestSource() == RequestSource.ALB) {
337+
queryStringParameter = decodeValueIfEncoded(queryStringParameter);
338+
}
330339
return queryStringParameter;
331340
}
332341

@@ -345,15 +354,35 @@ public Enumeration<String> getParameterNames() {
345354
if (request.getMultiValueQueryStringParameters() == null) {
346355
return Collections.enumeration(formParameterNames);
347356
}
348-
return Collections.enumeration(Stream.concat(formParameterNames.stream(),
349-
request.getMultiValueQueryStringParameters().keySet().stream()).collect(Collectors.toSet()));
357+
358+
Set<String> paramNames = request.getMultiValueQueryStringParameters().keySet();
359+
if (request.getRequestSource() == RequestSource.ALB) {
360+
paramNames = paramNames.stream().map(AwsProxyHttpServletRequest::decodeValueIfEncoded).collect(Collectors.toSet());
361+
}
362+
363+
return Collections.enumeration(
364+
Stream.concat(formParameterNames.stream(), paramNames.stream())
365+
.collect(Collectors.toSet()));
350366
}
351367

352368

353369
@Override
354370
@SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") // suppressing this as according to the specs we should be returning null here if we can't find params
355371
public String[] getParameterValues(String s) {
372+
373+
// decode key if ALB
374+
if (request.getRequestSource() == RequestSource.ALB) {
375+
s = decodeValueIfEncoded(s);
376+
}
377+
378+
// TODO lots of back and forth arrays and lists here, sort it out!
356379
List<String> values = new ArrayList<>(Arrays.asList(getQueryParamValues(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive())));
380+
// List<String> values = getQueryParamValuesAsList(request.getMultiValueQueryStringParameters(), s, config.isQueryStringCaseSensitive());
381+
382+
// decode values if ALB
383+
if (request.getRequestSource() == RequestSource.ALB) {
384+
values = values.stream().map(AwsHttpServletRequest::decodeValueIfEncoded).collect(Collectors.toList());
385+
}
357386

358387
values.addAll(Arrays.asList(getFormBodyParameterCaseInsensitive(s)));
359388

@@ -367,7 +396,7 @@ public String[] getParameterValues(String s) {
367396

368397
@Override
369398
public Map<String, String[]> getParameterMap() {
370-
return generateParameterMap(request.getMultiValueQueryStringParameters(), config);
399+
return generateParameterMap(request.getMultiValueQueryStringParameters(), config, request.getRequestSource() == RequestSource.ALB);
371400
}
372401

373402

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ public class AwsProxyHttpServletRequestTest {
3333
private static final String FORM_PARAM_NAME = "name";
3434
private static final String FORM_PARAM_NAME_VALUE = "Stef";
3535
private static final String FORM_PARAM_TEST = "test_cookie_param";
36-
private static final String QUERY_STRING_NAME_VALUE = "Bob";
37-
private static final String QUERY_STRING_NAME = "name";
36+
private static final String QUERY_STRING_NAME_VALUE = "Bob B!";
37+
private static final String QUERY_STRING_NAME = "name$";
3838
private static final String REQUEST_SCHEME_HTTP = "http";
3939
private static final String USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36";
4040
private static final String REFERER = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox";

0 commit comments

Comments
 (0)