From 451890c96a00c82ae4bcbf3fd228247f2e8167e5 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Wed, 29 Jan 2020 13:24:06 +0100 Subject: [PATCH] Use the domain socket path instead of "localhost" for building the shared server map key when binding an HTTP server - closes #3218 --- .../io/vertx/core/http/HttpConnection.java | 4 +- .../io/vertx/core/http/HttpServerRequest.java | 4 +- .../io/vertx/core/http/WebSocketBase.java | 4 +- .../vertx/core/http/impl/HttpServerImpl.java | 3 +- .../java/io/vertx/core/net/NetSocket.java | 4 +- .../java/io/vertx/core/http/HttpTest.java | 39 +++++++++++++------ src/test/java/io/vertx/core/net/NetTest.java | 38 ++++++++++++++++++ 7 files changed, 76 insertions(+), 20 deletions(-) diff --git a/src/main/java/io/vertx/core/http/HttpConnection.java b/src/main/java/io/vertx/core/http/HttpConnection.java index d7edac7f9..75541f1dc 100644 --- a/src/main/java/io/vertx/core/http/HttpConnection.java +++ b/src/main/java/io/vertx/core/http/HttpConnection.java @@ -233,13 +233,13 @@ public interface HttpConnection { HttpConnection exceptionHandler(Handler handler); /** - * @return the remote address for this connection + * @return the remote address for this connection, possibly {@code null} (e.g a server bound on a domain socket) */ @CacheReturn SocketAddress remoteAddress(); /** - * @return the remote address for this connection + * @return the local address for this connection, possibly {@code null} (e.g a server bound on a domain socket) */ @CacheReturn SocketAddress localAddress(); diff --git a/src/main/java/io/vertx/core/http/HttpServerRequest.java b/src/main/java/io/vertx/core/http/HttpServerRequest.java index 84778abd7..03fea40aa 100644 --- a/src/main/java/io/vertx/core/http/HttpServerRequest.java +++ b/src/main/java/io/vertx/core/http/HttpServerRequest.java @@ -162,13 +162,13 @@ public interface HttpServerRequest extends ReadStream { /** - * @return the remote (client side) address of the request + * @return the remote address for this connection, possibly {@code null} (e.g a server bound on a domain socket) */ @CacheReturn SocketAddress remoteAddress(); /** - * @return the local (server side) address of the server that handles the request + * @return the local address for this connection, possibly {@code null} (e.g a server bound on a domain socket) */ @CacheReturn SocketAddress localAddress(); diff --git a/src/main/java/io/vertx/core/http/WebSocketBase.java b/src/main/java/io/vertx/core/http/WebSocketBase.java index bd2458f57..b1d465d35 100644 --- a/src/main/java/io/vertx/core/http/WebSocketBase.java +++ b/src/main/java/io/vertx/core/http/WebSocketBase.java @@ -337,13 +337,13 @@ public interface WebSocketBase extends ReadStream, WriteStream { void close(short statusCode, @Nullable String reason, Handler> handler); /** - * @return the remote address for this socket + * @return the remote address for this connection, possibly {@code null} (e.g a server bound on a domain socket) */ @CacheReturn SocketAddress remoteAddress(); /** - * @return the local address for this socket + * @return the local address for this connection, possibly {@code null} (e.g a server bound on a domain socket) */ @CacheReturn SocketAddress localAddress(); diff --git a/src/main/java/io/vertx/core/http/impl/HttpServerImpl.java b/src/main/java/io/vertx/core/http/impl/HttpServerImpl.java index 754bd22ab..c6cae48ac 100644 --- a/src/main/java/io/vertx/core/http/impl/HttpServerImpl.java +++ b/src/main/java/io/vertx/core/http/impl/HttpServerImpl.java @@ -228,6 +228,7 @@ public class HttpServerImpl implements HttpServer, Closeable, MetricsProvider { listenContext = vertx.getOrCreateContext(); listening = true; String host = address.host() != null ? address.host() : "localhost"; + String hostOrPath = address.host() != null ? address.host() : address.path(); int port = address.port(); List applicationProtocols = options.getAlpnVersions(); if (listenContext.isWorkerContext()) { @@ -237,7 +238,7 @@ public class HttpServerImpl implements HttpServer, Closeable, MetricsProvider { Map sharedHttpServers = vertx.sharedHttpServers(); synchronized (sharedHttpServers) { this.actualPort = port; // Will be updated on bind for a wildcard port - id = new ServerID(port, host); + id = new ServerID(port, hostOrPath); HttpServerImpl shared = sharedHttpServers.get(id); if (shared == null || port == 0) { serverChannelGroup = new DefaultChannelGroup("vertx-acceptor-channels", GlobalEventExecutor.INSTANCE); diff --git a/src/main/java/io/vertx/core/net/NetSocket.java b/src/main/java/io/vertx/core/net/NetSocket.java index 730d519b6..537d5fb18 100644 --- a/src/main/java/io/vertx/core/net/NetSocket.java +++ b/src/main/java/io/vertx/core/net/NetSocket.java @@ -199,13 +199,13 @@ public interface NetSocket extends ReadStream, WriteStream { NetSocket sendFile(String filename, long offset, long length, Handler> resultHandler); /** - * @return the remote address for this socket + * @return the remote address for this connection, possibly {@code null} (e.g a server bound on a domain socket) */ @CacheReturn SocketAddress remoteAddress(); /** - * @return the local address for this socket + * @return the local address for this connection, possibly {@code null} (e.g a server bound on a domain socket) */ @CacheReturn SocketAddress localAddress(); diff --git a/src/test/java/io/vertx/core/http/HttpTest.java b/src/test/java/io/vertx/core/http/HttpTest.java index d0b728071..04b30bf56 100644 --- a/src/test/java/io/vertx/core/http/HttpTest.java +++ b/src/test/java/io/vertx/core/http/HttpTest.java @@ -141,18 +141,35 @@ public abstract class HttpTest extends HttpTestBase { public void testListenDomainSocketAddress() throws Exception { Vertx vx = Vertx.vertx(new VertxOptions().setPreferNativeTransport(true)); Assume.assumeTrue("Native transport must be enabled", vx.isNativeTransportEnabled()); - HttpServer httpserver = vx.createHttpServer(createBaseServerOptions()).requestHandler(req -> req.response().end()); - File sockFile = TestUtils.tmpFile(".sock"); - SocketAddress sockAddress = SocketAddress.domainSocketAddress(sockFile.getAbsolutePath()); - httpserver.listen(sockAddress, onSuccess(server -> { - client.request(HttpMethod.GET, sockAddress, new RequestOptions() - .setHost(DEFAULT_HTTP_HOST).setPort(DEFAULT_HTTP_PORT).setURI(DEFAULT_TEST_URI), resp -> { - resp.endHandler(v -> { - testComplete(); + int len = 3; + waitFor(len * len); + List addresses = new ArrayList<>(); + for (int i = 0;i < len;i++) { + File sockFile = TestUtils.tmpFile(".sock"); + SocketAddress sockAddress = SocketAddress.domainSocketAddress(sockFile.getAbsolutePath()); + HttpServer server = vertx + .createHttpServer(createBaseServerOptions()) + .requestHandler(req -> req.response().end(sockAddress.path())); + startServer(sockAddress, server); + addresses.add(sockAddress); + } + for (int i = 0;i < len;i++) { + SocketAddress sockAddress = addresses.get(i); + for (int j = 0;j < len;j++) { + client.request(HttpMethod.GET, sockAddress, new RequestOptions() + .setHost(DEFAULT_HTTP_HOST) + .setPort(DEFAULT_HTTP_PORT) + .setURI(DEFAULT_TEST_URI), resp -> { + resp.exceptionHandler(this::fail); + resp.bodyHandler(body -> { + assertEquals(sockAddress.path(), body.toString()); + complete(); }); - }).end(); - })); - + }) + .exceptionHandler(this::fail) + .end(); + } + } try { await(); } finally { diff --git a/src/test/java/io/vertx/core/net/NetTest.java b/src/test/java/io/vertx/core/net/NetTest.java index 4c0bf634a..f63d713b5 100755 --- a/src/test/java/io/vertx/core/net/NetTest.java +++ b/src/test/java/io/vertx/core/net/NetTest.java @@ -1803,6 +1803,44 @@ public class NetTest extends VertxTestBase { } } + @Test + public void testListenDomainSocketAddress() throws Exception { + Vertx vx = Vertx.vertx(new VertxOptions().setPreferNativeTransport(true)); + Assume.assumeTrue("Native transport must be enabled", vx.isNativeTransportEnabled()); + int len = 3; + waitFor(len * len); + List addresses = new ArrayList<>(); + for (int i = 0;i < len;i++) { + File sockFile = TestUtils.tmpFile(".sock"); + SocketAddress sockAddress = SocketAddress.domainSocketAddress(sockFile.getAbsolutePath()); + NetServer server = vertx + .createNetServer() + .connectHandler(so -> { + so.end(Buffer.buffer(sockAddress.path())); + }); + startServer(sockAddress, server); + addresses.add(sockAddress); + } + for (int i = 0;i < len;i++) { + for (int j = 0;j < len;j++) { + SocketAddress sockAddress = addresses.get(i); + client.connect(sockAddress, onSuccess(so -> { + Buffer received = Buffer.buffer(); + so.handler(received::appendBuffer); + so.closeHandler(v -> { + assertEquals(received.toString(), sockAddress.path()); + complete(); + }); + })); + } + } + try { + await(); + } finally { + vx.close(); + } + } + @Test // Need to: // sudo sysctl -w net.core.somaxconn=10000