Skip to content

Commit 4032d14

Browse files
committed
Change parse header function to handle base64 encoded values in headers (#263)
1 parent 0e6468c commit 4032d14

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,18 @@
1313
package com.amazonaws.serverless.proxy.internal.servlet;
1414

1515
import com.amazonaws.serverless.proxy.RequestReader;
16+
import com.amazonaws.serverless.proxy.internal.LambdaContainerHandler;
1617
import com.amazonaws.serverless.proxy.internal.SecurityUtils;
1718
import com.amazonaws.serverless.proxy.model.AwsProxyRequestContext;
1819
import com.amazonaws.serverless.proxy.model.ContainerConfig;
1920
import com.amazonaws.serverless.proxy.model.MultiValuedTreeMap;
2021
import com.amazonaws.services.lambda.runtime.Context;
2122

23+
import com.fasterxml.jackson.core.JsonProcessingException;
24+
import org.apache.http.HeaderElement;
25+
import org.apache.http.message.BasicHeaderValueParser;
26+
import org.apache.http.message.ParserCursor;
27+
import org.apache.http.util.CharArrayBuffer;
2228
import org.slf4j.Logger;
2329
import org.slf4j.LoggerFactory;
2430

@@ -77,6 +83,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest {
7783
private ServletContext servletContext;
7884
private AwsHttpSession session;
7985
private String queryString;
86+
private BasicHeaderValueParser headerParser;
8087

8188
protected DispatcherType dispatcherType;
8289

@@ -95,6 +102,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest {
95102
AwsHttpServletRequest(Context lambdaContext) {
96103
this.lambdaContext = lambdaContext;
97104
attributes = new HashMap<>();
105+
headerParser = new BasicHeaderValueParser();
98106
}
99107

100108

@@ -352,6 +360,7 @@ protected List<HeaderValue> parseHeaderValue(String headerValue, String valueSep
352360
// Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
353361
// Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
354362
// Cookie: name=value; name2=value2; name3=value3
363+
// X-Custom-Header: YQ==
355364

356365
List<HeaderValue> values = new ArrayList<>();
357366
if (headerValue == null) {
@@ -365,7 +374,8 @@ protected List<HeaderValue> parseHeaderValue(String headerValue, String valueSep
365374
newValue.setRawValue(v);
366375

367376
for (String q : curValue.split(qualifierSeparator)) {
368-
if (q.contains(HEADER_KEY_VALUE_SEPARATOR)) {
377+
// contains key/value pairs and it's not a base64-encoded value.
378+
if (q.contains(HEADER_KEY_VALUE_SEPARATOR) && !q.trim().endsWith("==")) {
369379
String[] kv = q.split(HEADER_KEY_VALUE_SEPARATOR);
370380
// TODO: Should we concatenate the rest of the values?
371381
if (newValue.getValue() == null) {

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import static org.junit.Assert.*;
1616

17+
import java.util.Base64;
1718
import java.util.List;
1819

1920

@@ -75,6 +76,17 @@ public void headers_parseHeaderValue_complexAccept() {
7576
assertEquals(4, values.size());
7677
}
7778

79+
@Test
80+
public void headers_parseHeaderValue_encodedContentWithEquals() {
81+
AwsHttpServletRequest context = new AwsProxyHttpServletRequest(null,null,null);
82+
83+
String value = Base64.getUrlEncoder().encodeToString("a".getBytes());
84+
85+
List<AwsHttpServletRequest.HeaderValue> result = context.parseHeaderValue(value);
86+
87+
assertEquals("YQ==", result.get(0).getValue());
88+
}
89+
7890
@Test
7991
public void queryString_generateQueryString_validQuery() {
8092
AwsProxyHttpServletRequest request = new AwsProxyHttpServletRequest(queryString, mockContext, null, config);

0 commit comments

Comments
 (0)