Skip to content

Commit 39f970d

Browse files
mbfrederdeki
authored andcommitted
fix: Error with version 2.0.2 when multi-value header is active in alb
(cherry picked from commit 9463113)
1 parent b7cfe9b commit 39f970d

File tree

2 files changed

+33
-12
lines changed

2 files changed

+33
-12
lines changed

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

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -437,23 +437,27 @@ public String getRemoteAddr() {
437437
if (request.getRequestContext() == null || request.getRequestContext().getIdentity() == null) {
438438
return "127.0.0.1";
439439
}
440-
if (request.getRequestContext().getElb() != null) {
441-
return request.getHeaders().get(CLIENT_IP_HEADER);
440+
if (request.getRequestSource().equals(RequestSource.ALB)) {
441+
return Objects.nonNull(request.getHeaders()) ?
442+
request.getHeaders().get(CLIENT_IP_HEADER) :
443+
request.getMultiValueHeaders().getFirst(CLIENT_IP_HEADER);
442444
}
443445
return request.getRequestContext().getIdentity().getSourceIp();
444446
}
445447

446448

447449
@Override
448450
public String getRemoteHost() {
449-
if (Objects.nonNull(request.getRequestContext().getElb())) {
450-
String hostHeader = request.getHeaders().get(HttpHeaders.HOST);
451-
452-
// the host header has the form host:port, so we split the string to get the host part
453-
return Arrays.asList(hostHeader.split(":")).get(0);
451+
String hostHeader;
452+
if (request.getRequestSource().equals(RequestSource.ALB)) {
453+
hostHeader = Objects.nonNull(request.getHeaders()) ?
454+
request.getHeaders().get(HttpHeaders.HOST) :
455+
request.getMultiValueHeaders().getFirst(HttpHeaders.HOST);
456+
} else {
457+
hostHeader = request.getMultiValueHeaders().getFirst(HttpHeaders.HOST);
454458
}
455-
456-
return request.getMultiValueHeaders().getFirst(HttpHeaders.HOST);
459+
// the host header has the form host:port, so we split the string to get the host part
460+
return Arrays.asList(hostHeader.split(":")).get(0);
457461
}
458462

459463

@@ -483,8 +487,11 @@ public RequestDispatcher getRequestDispatcher(String s) {
483487

484488
@Override
485489
public int getRemotePort() {
486-
if (Objects.nonNull(request.getRequestContext().getElb())) {
487-
String portHeader = request.getHeaders().get(PORT_HEADER_NAME);
490+
if (request.getRequestSource().equals(RequestSource.ALB)) {
491+
String portHeader;
492+
portHeader = Objects.nonNull(request.getHeaders()) ?
493+
request.getHeaders().get(PORT_HEADER_NAME) :
494+
request.getMultiValueHeaders().getFirst(PORT_HEADER_NAME);
488495
if (Objects.nonNull(portHeader)) {
489496
return Integer.parseInt(portHeader);
490497
}

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,17 +652,31 @@ void serverName_albHostHeader_returnsHostHeader() {
652652
}
653653

654654
@Test
655-
void getRemoteHost_albHostHeader_returnsHostHeader() {
655+
void getRemoteHost_albHostHeader_singleValue_returnsHostHeader() {
656656
initAwsProxyHttpServletRequestTest("ALB");
657657
AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/test", "GET")
658658
.alb().build();
659+
proxyReq.setMultiValueHeaders(null);
659660
proxyReq.getHeaders().put(HttpHeaders.HOST, "testapi.us-east-1.elb.amazonaws.com");
660661
HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyReq, null, null);
661662

662663
String host = servletRequest.getRemoteHost();
663664
assertEquals("testapi.us-east-1.elb.amazonaws.com", host);
664665
}
665666

667+
@Test
668+
void getRemoteHost_albHostHeader_multiValue_returnsHostHeader() {
669+
initAwsProxyHttpServletRequestTest("ALB");
670+
AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/test", "GET")
671+
.header(HttpHeaders.HOST, "testapi.us-east-1.elb.amazonaws.com")
672+
.alb().build();
673+
proxyReq.setHeaders(null);
674+
HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyReq, null, null);
675+
676+
String host = servletRequest.getRemoteHost();
677+
assertEquals("testapi.us-east-1.elb.amazonaws.com", host);
678+
}
679+
666680
private AwsProxyRequestBuilder getRequestWithHeaders() {
667681
return new AwsProxyRequestBuilder("/hello", "GET")
668682
.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)

0 commit comments

Comments
 (0)