Skip to content

Commit

Permalink
Ensure that Vert.x's ConnectionBase#remoteAddress does not return null
Browse files Browse the repository at this point in the history
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
  • Loading branch information
geoand committed May 23, 2022
1 parent ba110b4 commit 55343ec
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<APIGatewayV2HTTPEvent, APIGatewayV2HTTPResponse> {
Expand All @@ -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();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<AwsProxyRequest, AwsProxyResponse> {
Expand All @@ -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\" }");
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {
Expand Down Expand Up @@ -63,6 +64,7 @@ public AmazonLambdaContext(HttpURLConnection request, ObjectReader cognitoReader
runtimeDeadlineMs = Long.valueOf(runtimeDeadline);
}
logger = LambdaRuntime.getLogger();
requestURL = request.getURL();
}

@Override
Expand Down Expand Up @@ -119,4 +121,8 @@ public int getMemoryLimitInMB() {
public LambdaLogger getLogger() {
return logger;
}

public URL getRequestURL() {
return requestURL;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ public SocketAddress clientAddress() {
return clientAddress;
}

public VirtualChannel peer() {
return peer;
}

public void close() {
// todo more cleanup?
connected = false;
Expand Down

0 comments on commit 55343ec

Please sign in to comment.