diff --git a/extensions/amazon-lambda-http/runtime/src/main/java/io/quarkus/amazon/lambda/http/LambdaHttpHandler.java b/extensions/amazon-lambda-http/runtime/src/main/java/io/quarkus/amazon/lambda/http/LambdaHttpHandler.java index 43d53032adcb3c..f0e2b23a123a9e 100644 --- a/extensions/amazon-lambda-http/runtime/src/main/java/io/quarkus/amazon/lambda/http/LambdaHttpHandler.java +++ b/extensions/amazon-lambda-http/runtime/src/main/java/io/quarkus/amazon/lambda/http/LambdaHttpHandler.java @@ -4,6 +4,7 @@ import java.io.ByteArrayOutputStream; import java.net.InetSocketAddress; +import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; import java.nio.charset.StandardCharsets; @@ -35,10 +36,13 @@ import io.netty.handler.codec.http.HttpVersion; import io.netty.handler.codec.http.LastHttpContent; import io.netty.util.ReferenceCountUtil; +import io.quarkus.amazon.lambda.runtime.AmazonLambdaContext; import io.quarkus.netty.runtime.virtual.VirtualClientConnection; import io.quarkus.netty.runtime.virtual.VirtualResponseHandler; import io.quarkus.vertx.http.runtime.QuarkusHttpHeaders; import io.quarkus.vertx.http.runtime.VertxHttpRecorder; +import io.vertx.core.net.SocketAddress; +import io.vertx.core.net.impl.ConnectionBase; @SuppressWarnings("unused") public class LambdaHttpHandler implements RequestHandler { @@ -61,7 +65,7 @@ public APIGatewayV2HTTPResponse handleRequest(APIGatewayV2HTTPEvent request, Con } try { - return nettyDispatch(clientAddress, request, context); + return nettyDispatch(clientAddress, request, (AmazonLambdaContext) context); } catch (Exception e) { log.error("Request Failure", e); APIGatewayV2HTTPResponse res = new APIGatewayV2HTTPResponse(); @@ -162,7 +166,7 @@ public void close() { } private APIGatewayV2HTTPResponse nettyDispatch(InetSocketAddress clientAddress, APIGatewayV2HTTPEvent request, - Context context) + AmazonLambdaContext context) throws Exception { QuarkusHttpHeaders quarkusHeaders = new QuarkusHttpHeaders(); quarkusHeaders.setContextObject(Context.class, context); @@ -211,6 +215,11 @@ httpMethod, ofNullable(request.getRawQueryString()) NettyResponseHandler handler = new NettyResponseHandler(request); VirtualClientConnection connection = VirtualClientConnection.connect(handler, VertxHttpRecorder.VIRTUAL_HTTP, clientAddress); + if (connection.peer().remoteAddress().equals(VertxHttpRecorder.VIRTUAL_HTTP)) { + URL requestURL = context.getRequestURL(); + connection.peer().attr(ConnectionBase.REMOTE_ADDRESS_OVERRIDE).set( + SocketAddress.inetSocketAddress(requestURL.getPort(), requestURL.getHost())); + } connection.sendMessage(nettyRequest); connection.sendMessage(requestContent); diff --git a/extensions/amazon-lambda-rest/runtime/src/main/java/io/quarkus/amazon/lambda/http/LambdaHttpHandler.java b/extensions/amazon-lambda-rest/runtime/src/main/java/io/quarkus/amazon/lambda/http/LambdaHttpHandler.java index 01f69632e7303d..bc219ffd8843be 100644 --- a/extensions/amazon-lambda-rest/runtime/src/main/java/io/quarkus/amazon/lambda/http/LambdaHttpHandler.java +++ b/extensions/amazon-lambda-rest/runtime/src/main/java/io/quarkus/amazon/lambda/http/LambdaHttpHandler.java @@ -2,6 +2,7 @@ import java.io.ByteArrayOutputStream; import java.net.InetSocketAddress; +import java.net.URL; import java.net.URLEncoder; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; @@ -33,10 +34,13 @@ import io.quarkus.amazon.lambda.http.model.AwsProxyRequestContext; import io.quarkus.amazon.lambda.http.model.AwsProxyResponse; import io.quarkus.amazon.lambda.http.model.Headers; +import io.quarkus.amazon.lambda.runtime.AmazonLambdaContext; import io.quarkus.netty.runtime.virtual.VirtualClientConnection; import io.quarkus.netty.runtime.virtual.VirtualResponseHandler; import io.quarkus.vertx.http.runtime.QuarkusHttpHeaders; import io.quarkus.vertx.http.runtime.VertxHttpRecorder; +import io.vertx.core.net.SocketAddress; +import io.vertx.core.net.impl.ConnectionBase; @SuppressWarnings("unused") public class LambdaHttpHandler implements RequestHandler { @@ -58,7 +62,7 @@ public AwsProxyResponse handleRequest(AwsProxyRequest request, Context context) } try { - return nettyDispatch(clientAddress, request, context); + return nettyDispatch(clientAddress, request, (AmazonLambdaContext) context); } catch (Exception e) { log.error("Request Failure", e); return new AwsProxyResponse(500, errorHeaders, "{ \"message\": \"Internal Server Error\" }"); @@ -147,7 +151,8 @@ public void close() { } } - private AwsProxyResponse nettyDispatch(InetSocketAddress clientAddress, AwsProxyRequest request, Context context) + private AwsProxyResponse nettyDispatch(InetSocketAddress clientAddress, AwsProxyRequest request, + AmazonLambdaContext context) throws Exception { String path = request.getPath(); //log.info("---- Got lambda request: " + path); @@ -203,6 +208,11 @@ private AwsProxyResponse nettyDispatch(InetSocketAddress clientAddress, AwsProxy NettyResponseHandler handler = new NettyResponseHandler(request); VirtualClientConnection connection = VirtualClientConnection.connect(handler, VertxHttpRecorder.VIRTUAL_HTTP, clientAddress); + if (connection.peer().remoteAddress().equals(VertxHttpRecorder.VIRTUAL_HTTP)) { + URL requestURL = context.getRequestURL(); + connection.peer().attr(ConnectionBase.REMOTE_ADDRESS_OVERRIDE).set( + SocketAddress.inetSocketAddress(requestURL.getPort(), requestURL.getHost())); + } connection.sendMessage(nettyRequest); connection.sendMessage(requestContent); diff --git a/extensions/amazon-lambda/common-runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaContext.java b/extensions/amazon-lambda/common-runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaContext.java index 3c40ab56f6078d..02b006d9024826 100644 --- a/extensions/amazon-lambda/common-runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaContext.java +++ b/extensions/amazon-lambda/common-runtime/src/main/java/io/quarkus/amazon/lambda/runtime/AmazonLambdaContext.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.net.HttpURLConnection; +import java.net.URL; import com.amazonaws.services.lambda.runtime.ClientContext; import com.amazonaws.services.lambda.runtime.CognitoIdentity; @@ -34,7 +35,7 @@ public class AmazonLambdaContext implements Context { private long runtimeDeadlineMs = 0; private final int memoryLimitInMB; private final LambdaLogger logger; - + private final URL requestURL; public AmazonLambdaContext(HttpURLConnection request, ObjectReader cognitoReader, ObjectReader clientCtxReader) throws IOException { @@ -63,6 +64,7 @@ public AmazonLambdaContext(HttpURLConnection request, ObjectReader cognitoReader runtimeDeadlineMs = Long.valueOf(runtimeDeadline); } logger = LambdaRuntime.getLogger(); + requestURL = request.getURL(); } @Override @@ -119,4 +121,8 @@ public int getMemoryLimitInMB() { public LambdaLogger getLogger() { return logger; } + + public URL getRequestURL() { + return requestURL; + } } diff --git a/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/virtual/VirtualClientConnection.java b/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/virtual/VirtualClientConnection.java index 8b83ab1f9306a6..5b2e72eb59f58c 100644 --- a/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/virtual/VirtualClientConnection.java +++ b/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/virtual/VirtualClientConnection.java @@ -24,6 +24,10 @@ public SocketAddress clientAddress() { return clientAddress; } + public VirtualChannel peer() { + return peer; + } + public void close() { // todo more cleanup? connected = false;