Skip to content

Commit ec98c39

Browse files
authored
Merge pull request #827 from mbfreder/alb-remoteHost
fix: getRemoteHost and getRemotePort for ALB
2 parents ac38ef5 + 46d9637 commit ec98c39

File tree

4 files changed

+37
-5
lines changed

4 files changed

+37
-5
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public abstract class AwsHttpServletRequest implements HttpServletRequest {
7676
static final String PROTOCOL_HEADER_NAME = "X-Forwarded-Proto";
7777
static final String HOST_HEADER_NAME = "Host";
7878
static final String PORT_HEADER_NAME = "X-Forwarded-Port";
79+
static final String CLIENT_IP_HEADER = "X-Forwarded-For";
7980

8081

8182
//-------------------------------------------------------------

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

Lines changed: 22 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;
@@ -435,12 +437,22 @@ public String getRemoteAddr() {
435437
if (request.getRequestContext() == null || request.getRequestContext().getIdentity() == null) {
436438
return "127.0.0.1";
437439
}
440+
if (request.getRequestContext().getElb() != null) {
441+
return request.getHeaders().get(CLIENT_IP_HEADER);
442+
}
438443
return request.getRequestContext().getIdentity().getSourceIp();
439444
}
440445

441446

442447
@Override
443448
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);
454+
}
455+
444456
return request.getMultiValueHeaders().getFirst(HttpHeaders.HOST);
445457
}
446458

@@ -471,6 +483,12 @@ public RequestDispatcher getRequestDispatcher(String s) {
471483

472484
@Override
473485
public int getRemotePort() {
486+
if (Objects.nonNull(request.getRequestContext().getElb())) {
487+
String portHeader = request.getHeaders().get(PORT_HEADER_NAME);
488+
if (Objects.nonNull(portHeader)) {
489+
return Integer.parseInt(portHeader);
490+
}
491+
}
474492
return 0;
475493
}
476494

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)