Skip to content

Commit b0058d1

Browse files
committed
fix remoteHost for ALB
1 parent 8d18990 commit b0058d1

3 files changed

Lines changed: 33 additions & 5 deletions

File tree

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@
2121
import com.amazonaws.serverless.proxy.model.RequestSource;
2222
import com.amazonaws.services.lambda.runtime.Context;
2323
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
24-
import org.slf4j.Logger;
25-
import org.slf4j.LoggerFactory;
26-
2724
import jakarta.servlet.*;
28-
import jakarta.servlet.http.*;
25+
import jakarta.servlet.http.Cookie;
26+
import jakarta.servlet.http.HttpServletRequest;
27+
import jakarta.servlet.http.HttpServletResponse;
28+
import jakarta.servlet.http.HttpUpgradeHandler;
2929
import jakarta.ws.rs.core.HttpHeaders;
3030
import jakarta.ws.rs.core.SecurityContext;
31+
import org.slf4j.Logger;
32+
import org.slf4j.LoggerFactory;
3133

3234
import java.io.BufferedReader;
3335
import java.io.IOException;
@@ -441,6 +443,13 @@ public String getRemoteAddr() {
441443

442444
@Override
443445
public String getRemoteHost() {
446+
if (Objects.nonNull(request.getRequestContext().getElb())) {
447+
String host_header = request.getHeaders().get(HttpHeaders.HOST);
448+
449+
// the host header has the form host:port, so we split the string to get the host part
450+
return Arrays.asList(host_header.split(":")).get(0);
451+
}
452+
444453
return request.getMultiValueHeaders().getFirst(HttpHeaders.HOST);
445454
}
446455

@@ -471,6 +480,12 @@ public RequestDispatcher getRequestDispatcher(String s) {
471480

472481
@Override
473482
public int getRemotePort() {
483+
if (Objects.nonNull(request.getRequestContext().getElb())) {
484+
String hostHeader = request.getHeaders().get(HttpHeaders.HOST);
485+
String port = Arrays.asList(hostHeader.split(":")).get(1);
486+
if (Objects.nonNull(port))
487+
return Integer.parseInt(port);
488+
}
474489
return 0;
475490
}
476491

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,18 @@ void serverName_albHostHeader_returnsHostHeader() {
651651
assertEquals("testapi.us-east-1.elb.amazonaws.com", serverName);
652652
}
653653

654+
@Test
655+
void getRemoteHost_albHostHeader_returnsHostHeader() {
656+
initAwsProxyHttpServletRequestTest("ALB");
657+
AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/test", "GET")
658+
.alb().build();
659+
proxyReq.getHeaders().put(HttpHeaders.HOST, "testapi.us-east-1.elb.amazonaws.com");
660+
HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyReq, null, null);
661+
662+
String host = servletRequest.getRemoteHost();
663+
assertEquals("testapi.us-east-1.elb.amazonaws.com", host);
664+
}
665+
654666
private AwsProxyRequestBuilder getRequestWithHeaders() {
655667
return new AwsProxyRequestBuilder("/hello", "GET")
656668
.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)

aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ public AwsProxyRequestBuilder(AwsProxyRequest req) {
7070

7171
public AwsProxyRequestBuilder(String path, String httpMethod) {
7272
this.request = new AwsProxyRequest();
73-
this.request.setMultiValueHeaders(new Headers()); // avoid NPE
73+
this.request.setMultiValueHeaders(new Headers());// avoid NPE
74+
this.request.setHeaders(new SingleValueHeaders());
7475
this.request.setHttpMethod(httpMethod);
7576
this.request.setPath(path);
7677
this.request.setMultiValueQueryStringParameters(new MultiValuedTreeMap<>());

0 commit comments

Comments
 (0)