Skip to content

Commit 0699fa0

Browse files
authored
Handle incorrect address in X-Forward-Host headers (#393)
1 parent 3332426 commit 0699fa0

File tree

2 files changed

+42
-8
lines changed

2 files changed

+42
-8
lines changed

src/main/java/com/uid2/shared/vertx/RequestCapturingHandler.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,19 @@ public void handle(RoutingContext context) {
6262
}
6363

6464
long timestamp = System.currentTimeMillis();
65-
String remoteClient = getClientAddress(context.request().remoteAddress());
65+
String remoteClient = null;
66+
try {
67+
SocketAddress remoteAddress = context.request().remoteAddress();
68+
remoteClient = getClientAddress(remoteAddress);
69+
} catch (NullPointerException ex) {
70+
LOGGER.warn("remoteAddress() throws NullPointerException");
71+
}
72+
6673
HttpMethod method = context.request().method();
6774
String uri = context.request().uri();
6875
HttpVersion version = context.request().version();
69-
context.addBodyEndHandler(v -> captureNoThrow(context, timestamp, remoteClient, version, method, uri));
76+
String finalRemoteClient = remoteClient;
77+
context.addBodyEndHandler(v -> captureNoThrow(context, timestamp, finalRemoteClient, version, method, uri));
7078
context.next();
7179
}
7280

@@ -80,8 +88,8 @@ private String getClientAddress(SocketAddress inetSocketAddress) {
8088
private void captureNoThrow(RoutingContext context, long timestamp, String remoteClient, HttpVersion version, HttpMethod method, String uri) {
8189
try {
8290
capture(context, timestamp, remoteClient, version, method, uri);
83-
} catch (Throwable t) {
84-
LOGGER.error("capture() throws", t);
91+
} catch (RuntimeException e) {
92+
LOGGER.error("capture() throws", e);
8593
}
8694
}
8795

src/test/java/com/uid2/shared/vertx/RequestCapturingHandlerTest.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,29 @@
1010
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
1111
import io.vertx.core.Handler;
1212
import io.vertx.core.Vertx;
13+
import io.vertx.core.http.HttpHeaders;
14+
import io.vertx.core.http.HttpMethod;
15+
import io.vertx.core.http.RequestOptions;
1316
import io.vertx.core.json.JsonObject;
17+
import io.vertx.ext.web.AllowForwardHeaders;
1418
import io.vertx.ext.web.Router;
1519
import io.vertx.ext.web.RoutingContext;
1620
import io.vertx.ext.web.client.WebClient;
1721
import io.vertx.junit5.VertxExtension;
1822
import io.vertx.junit5.VertxTestContext;
19-
import org.assertj.core.condition.AnyOf;
2023
import org.junit.jupiter.api.Assertions;
2124
import org.junit.jupiter.api.BeforeEach;
2225
import org.junit.jupiter.api.Test;
2326
import org.junit.jupiter.api.extension.ExtendWith;
2427
import org.junit.jupiter.params.ParameterizedTest;
2528
import org.junit.jupiter.params.provider.Arguments;
2629
import org.junit.jupiter.params.provider.MethodSource;
27-
import org.mockito.Mock;
2830
import org.mockito.Mockito;
2931

3032
import java.time.Instant;
31-
import java.util.HashSet;
3233
import java.util.Set;
3334
import java.util.stream.Stream;
3435

35-
import static org.mockito.ArgumentMatchers.anyInt;
3636
import static org.mockito.Mockito.when;
3737

3838
@ExtendWith(VertxExtension.class)
@@ -147,6 +147,32 @@ public void captureUnknownPath(Vertx vertx, VertxTestContext testContext) {
147147
}));
148148
}
149149

150+
@Test
151+
public void handleIncorrectRemoteAddress(Vertx vertx, VertxTestContext testContext) {
152+
Router router = Router.router(vertx);
153+
router.allowForward(AllowForwardHeaders.X_FORWARD);
154+
router.route().handler(new RequestCapturingHandler(siteStore));
155+
156+
vertx.createHttpServer().requestHandler(router).listen(Port, testContext.succeeding(id -> {
157+
WebClient client = WebClient.create(vertx);
158+
RequestOptions requestOptions = new RequestOptions();
159+
requestOptions.setHost("localhost");
160+
requestOptions.setPort(Integer.valueOf(Port));
161+
requestOptions.addHeader(HttpHeaders.createOptimized("X-Forwarded-Host"), "[2001:db8::1"); // Incorrect IPV6
162+
client.request(HttpMethod.GET, requestOptions).sendJsonObject(new JsonObject(), testContext.succeeding(response -> testContext.verify(() -> {
163+
Assertions.assertDoesNotThrow(() ->
164+
Metrics.globalRegistry
165+
.get("uid2.http_requests")
166+
.tag("status", "404")
167+
.tag("method", "GET")
168+
.tag("path", "unknown")
169+
.counter()
170+
);
171+
testContext.completeNow();
172+
})));
173+
}));
174+
}
175+
150176
@ParameterizedTest
151177
@MethodSource("siteIdRoutingContextData")
152178
public void getSiteIdFromRoutingContextData(String key, Object value, String siteId, String siteName, Vertx vertx, VertxTestContext testContext) {

0 commit comments

Comments
 (0)