From 31ebe35f2020a7e32ef8bc0e3c72adf1075fd942 Mon Sep 17 00:00:00 2001 From: Violeta Georgieva Date: Mon, 13 Jan 2020 16:42:35 +0200 Subject: [PATCH] Ensure the global ConnectionProvider is cleared on server.dispose when the server address is not any local address --- .../resources/PooledConnectionProvider.java | 8 +-- .../netty/http/server/HttpServerTests.java | 54 +++++++++++-------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/main/java/reactor/netty/resources/PooledConnectionProvider.java b/src/main/java/reactor/netty/resources/PooledConnectionProvider.java index 12c4ff3662..929a70badf 100644 --- a/src/main/java/reactor/netty/resources/PooledConnectionProvider.java +++ b/src/main/java/reactor/netty/resources/PooledConnectionProvider.java @@ -118,9 +118,11 @@ else if (origin instanceof InetSocketAddress && target instanceof InetSocketAddress) { InetSocketAddress isaOrigin = (InetSocketAddress) origin; InetSocketAddress isaTarget = (InetSocketAddress) target; - InetAddress iaTarget = isaTarget.getAddress(); - return iaTarget != null && iaTarget.isAnyLocalAddress() && - isaOrigin.getPort() == isaTarget.getPort(); + if (isaOrigin.getPort() == isaTarget.getPort()) { + InetAddress iaTarget = isaTarget.getAddress(); + return (iaTarget != null && iaTarget.isAnyLocalAddress()) || + Objects.equals(isaOrigin.getHostString(), isaTarget.getHostString()); + } } return false; } diff --git a/src/test/java/reactor/netty/http/server/HttpServerTests.java b/src/test/java/reactor/netty/http/server/HttpServerTests.java index 24b9c6a005..514f4cc1c3 100644 --- a/src/test/java/reactor/netty/http/server/HttpServerTests.java +++ b/src/test/java/reactor/netty/http/server/HttpServerTests.java @@ -153,34 +153,42 @@ public void releaseInboundChannelOnNonKeepAliveRequest() { //from https://github.com/reactor/reactor-netty/issues/90 @Test public void testRestart() { - doTestRestart(HttpServer.create() - .port(8080), - HttpClient.create() - .port(8080)); - doTestRestart(HttpServer.create() - // Any local address - .tcpConfiguration(tcpServer -> tcpServer.addressSupplier(() -> new InetSocketAddress(8080))), - HttpClient.create() - .port(8080)); + HttpServer server1 = HttpServer.create() + .host("localhost") + .port(8080); + HttpServer server2 = + HttpServer.create() + // Any local address + .tcpConfiguration(tcpServer -> tcpServer.addressSupplier(() -> new InetSocketAddress(8080))); + HttpClient client1 = HttpClient.create() + .port(8080) + .tcpConfiguration(tcpClient -> tcpClient.host("localhost")); + HttpClient client2 = HttpClient.create() + .baseUrl("http://localhost:8080"); + doTestRestart(server1, client1); + doTestRestart(server1, client2); + doTestRestart(server2, client1); + doTestRestart(server2, client2); } private void doTestRestart(HttpServer server, HttpClient client) { - Integer code; + String response; try { // start a first server with a handler that answers HTTP 200 OK - disposableServer = server.handle((req, resp) -> resp.status(200).send()) + disposableServer = server.handle((req, resp) -> resp.sendString(Mono.just("200"))) .wiretap(true) .bindNow(); - code = client.wiretap(true) + response = client.wiretap(true) .get() .uri("/") - .response() - .map(res -> res.status().code()) + .responseContent() + .aggregate() + .asString() .block(); // checking the response status, OK - assertThat(code).isEqualTo(200); + assertThat(response).isEqualTo("200"); } finally { // dispose the Netty context and wait for the channel close @@ -191,17 +199,19 @@ private void doTestRestart(HttpServer server, HttpClient client) { try { // create a totally new server instance, with a different handler that answers HTTP 201 - disposableServer = server.handle((req, resp) -> resp.status(201).send()) + disposableServer = server.handle((req, resp) -> resp.sendString(Mono.just("201"))) .wiretap(true) .bindNow(); - code = client.wiretap(true) - .get() - .uri("/") - .responseSingle((res, buf) -> Mono.just(res.status().code())) - .block(); + response = client.wiretap(true) + .get() + .uri("/") + .responseContent() + .aggregate() + .asString() + .block(); - assertThat(code).isEqualTo(201); + assertThat(response).isEqualTo("201"); } finally { // dispose the Netty context and wait for the channel close