From 46d22dbd906a6c324f32c07ff5f34e270f568e3b Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Mon, 23 May 2022 11:13:00 +0300 Subject: [PATCH] Ensure that Vert.x's ConnectionBase#remoteAddress does not return null This is done for the Amazon lambda stuff in order to ensure that tracing works properly. The remote address is currently set to the local Quarkus server, which seems to make most sense. Fixes: #25708 --- .../amazon/lambda/http/LambdaHttpHandler.java | 13 +++++++++++-- .../amazon/lambda/http/LambdaHttpHandler.java | 14 ++++++++++++-- .../amazon/lambda/runtime/AmazonLambdaContext.java | 8 +++++++- .../runtime/virtual/VirtualClientConnection.java | 4 ++++ 4 files changed, 34 insertions(+), 5 deletions(-) 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 43d53032adcb3..f0e2b23a123a9 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 01f69632e7303..bc219ffd8843b 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 3c40ab56f6078..02b006d902482 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 8b83ab1f9306a..5b2e72eb59f58 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;