diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java index 17d04a57c..fe514e65d 100644 --- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java +++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java @@ -437,8 +437,10 @@ public String getRemoteAddr() { if (request.getRequestContext() == null || request.getRequestContext().getIdentity() == null) { return "127.0.0.1"; } - if (request.getRequestContext().getElb() != null) { - return request.getHeaders().get(CLIENT_IP_HEADER); + if (request.getRequestSource().equals(RequestSource.ALB)) { + return Objects.nonNull(request.getHeaders()) ? + request.getHeaders().get(CLIENT_IP_HEADER) : + request.getMultiValueHeaders().getFirst(CLIENT_IP_HEADER); } return request.getRequestContext().getIdentity().getSourceIp(); } @@ -446,14 +448,16 @@ public String getRemoteAddr() { @Override public String getRemoteHost() { - if (Objects.nonNull(request.getRequestContext().getElb())) { - String hostHeader = request.getHeaders().get(HttpHeaders.HOST); - - // the host header has the form host:port, so we split the string to get the host part - return Arrays.asList(hostHeader.split(":")).get(0); + String hostHeader; + if (request.getRequestSource().equals(RequestSource.ALB)) { + hostHeader = Objects.nonNull(request.getHeaders()) ? + request.getHeaders().get(HttpHeaders.HOST) : + request.getMultiValueHeaders().getFirst(HttpHeaders.HOST); + } else { + hostHeader = request.getMultiValueHeaders().getFirst(HttpHeaders.HOST); } - - return request.getMultiValueHeaders().getFirst(HttpHeaders.HOST); + // the host header has the form host:port, so we split the string to get the host part + return Arrays.asList(hostHeader.split(":")).get(0); } @@ -483,8 +487,11 @@ public RequestDispatcher getRequestDispatcher(String s) { @Override public int getRemotePort() { - if (Objects.nonNull(request.getRequestContext().getElb())) { - String portHeader = request.getHeaders().get(PORT_HEADER_NAME); + if (request.getRequestSource().equals(RequestSource.ALB)) { + String portHeader; + portHeader = Objects.nonNull(request.getHeaders()) ? + request.getHeaders().get(PORT_HEADER_NAME) : + request.getMultiValueHeaders().getFirst(PORT_HEADER_NAME); if (Objects.nonNull(portHeader)) { return Integer.parseInt(portHeader); } diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java index 45c38843e..4edcf5241 100644 --- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java +++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java @@ -652,10 +652,11 @@ void serverName_albHostHeader_returnsHostHeader() { } @Test - void getRemoteHost_albHostHeader_returnsHostHeader() { + void getRemoteHost_albHostHeader_singleValue_returnsHostHeader() { initAwsProxyHttpServletRequestTest("ALB"); AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/test", "GET") .alb().build(); + proxyReq.setMultiValueHeaders(null); proxyReq.getHeaders().put(HttpHeaders.HOST, "testapi.us-east-1.elb.amazonaws.com"); HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyReq, null, null); @@ -663,6 +664,19 @@ void getRemoteHost_albHostHeader_returnsHostHeader() { assertEquals("testapi.us-east-1.elb.amazonaws.com", host); } + @Test + void getRemoteHost_albHostHeader_multiValue_returnsHostHeader() { + initAwsProxyHttpServletRequestTest("ALB"); + AwsProxyRequest proxyReq = new AwsProxyRequestBuilder("/test", "GET") + .header(HttpHeaders.HOST, "testapi.us-east-1.elb.amazonaws.com") + .alb().build(); + proxyReq.setHeaders(null); + HttpServletRequest servletRequest = new AwsProxyHttpServletRequest(proxyReq, null, null); + + String host = servletRequest.getRemoteHost(); + assertEquals("testapi.us-east-1.elb.amazonaws.com", host); + } + private AwsProxyRequestBuilder getRequestWithHeaders() { return new AwsProxyRequestBuilder("/hello", "GET") .header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)