From 2b69cbe7592d7a8ba3461b6afef90073128244d4 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Thu, 1 Jun 2023 15:02:22 +0200 Subject: [PATCH] Allow empty path for unix socket addresses to represent unnamed addresses and work around the null domain socket address returned by Netty client channels. --- .../core/impl/transports/KQueueTransport.java | 6 +-- .../java/io/vertx/core/net/SocketAddress.java | 2 +- .../vertx/core/net/impl/ConnectionBase.java | 4 ++ .../core/net/impl/SocketAddressImpl.java | 1 - src/test/java/io/vertx/core/net/NetTest.java | 49 ++++++++++++------- 5 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/main/java/io/vertx/core/impl/transports/KQueueTransport.java b/src/main/java/io/vertx/core/impl/transports/KQueueTransport.java index 0c6d077faee..c13a3094baa 100644 --- a/src/main/java/io/vertx/core/impl/transports/KQueueTransport.java +++ b/src/main/java/io/vertx/core/impl/transports/KQueueTransport.java @@ -53,11 +53,7 @@ public SocketAddress convert(io.vertx.core.net.SocketAddress address) { @Override public io.vertx.core.net.SocketAddress convert(SocketAddress address) { if (address instanceof DomainSocketAddress) { - String path = ((DomainSocketAddress) address).path(); - if (path.isEmpty()) { - return null; - } - return new SocketAddressImpl(path); + return new SocketAddressImpl(((DomainSocketAddress) address).path()); } return Transport.super.convert(address); } diff --git a/src/main/java/io/vertx/core/net/SocketAddress.java b/src/main/java/io/vertx/core/net/SocketAddress.java index 7628d768edd..dc762f0c74b 100644 --- a/src/main/java/io/vertx/core/net/SocketAddress.java +++ b/src/main/java/io/vertx/core/net/SocketAddress.java @@ -125,7 +125,7 @@ static SocketAddress inetSocketAddress(InetSocketAddress address) { int port(); /** - * @return the domain socket path or {@code null} for a inet socket address. + * @return the domain socket path or {@code null} for inet socket address, empty path represents unnamed domain socket addresses. */ @CacheReturn String path(); diff --git a/src/main/java/io/vertx/core/net/impl/ConnectionBase.java b/src/main/java/io/vertx/core/net/impl/ConnectionBase.java index 7c76b266250..a5394ba175a 100644 --- a/src/main/java/io/vertx/core/net/impl/ConnectionBase.java +++ b/src/main/java/io/vertx/core/net/impl/ConnectionBase.java @@ -654,6 +654,10 @@ public SocketAddress remoteAddress(boolean real) { private SocketAddress channelLocalAddress() { java.net.SocketAddress addr = chctx.channel().localAddress(); + if (addr == null && channel().getClass().getSimpleName().endsWith("DomainSocketChannel")) { + // Workaround bug https://github.com/netty/netty/issues/13417 + return SocketAddress.domainSocketAddress(""); + } return addr != null ? vertx.transport().convert(addr) : null; } diff --git a/src/main/java/io/vertx/core/net/impl/SocketAddressImpl.java b/src/main/java/io/vertx/core/net/impl/SocketAddressImpl.java index 6d3d3f8b3eb..5fd5c9c51a4 100644 --- a/src/main/java/io/vertx/core/net/impl/SocketAddressImpl.java +++ b/src/main/java/io/vertx/core/net/impl/SocketAddressImpl.java @@ -82,7 +82,6 @@ public SocketAddressImpl(int port, String host) { public SocketAddressImpl(String path) { Objects.requireNonNull(path, "domain socket path must be non null"); - Arguments.require(!path.isEmpty(), "domain socket must not be empty"); this.port = -1; this.host = null; this.ipAddress = null; diff --git a/src/test/java/io/vertx/core/net/NetTest.java b/src/test/java/io/vertx/core/net/NetTest.java index e4c5b610cf6..d7e0604b97a 100755 --- a/src/test/java/io/vertx/core/net/NetTest.java +++ b/src/test/java/io/vertx/core/net/NetTest.java @@ -2206,24 +2206,33 @@ public void testFanout() throws Exception { } @Test - public void testRemoteAddress() { + public void testSocketAddress() { server.connectHandler(socket -> { - SocketAddress addr = socket.remoteAddress(); - assertEquals("127.0.0.1", addr.host()); - assertEquals(null, addr.hostName()); - assertEquals("127.0.0.1", addr.hostAddress()); + SocketAddress addr = socket.localAddress(); + if (addr.isInetSocket()) { + assertEquals("127.0.0.1", addr.host()); + assertEquals(null, addr.hostName()); + assertEquals("127.0.0.1", addr.hostAddress()); + } else { + assertEquals(testAddress.path(), addr.path()); + assertEquals("", socket.remoteAddress().path()); + } socket.close(); - }).listen(1234, "localhost", ar -> { - assertTrue(ar.succeeded()); - vertx.createNetClient(new NetClientOptions()).connect(1234, "localhost", onSuccess(socket -> { + }).listen(1234, "localhost").onComplete(onSuccess(v -> { + vertx.createNetClient(new NetClientOptions()).connect(1234, "localhost").onComplete(onSuccess(socket -> { SocketAddress addr = socket.remoteAddress(); - assertEquals("localhost", addr.host()); - assertEquals("localhost", addr.hostName()); - assertEquals("127.0.0.1", addr.hostAddress()); - assertEquals(addr.port(), 1234); - socket.closeHandler(v -> testComplete()); + if (addr.isInetSocket()) { + assertEquals("localhost", addr.host()); + assertEquals("localhost", addr.hostName()); + assertEquals("127.0.0.1", addr.hostAddress()); + assertEquals(addr.port(), 1234); + } else { + assertEquals(testAddress.path(), addr.path()); + assertEquals("", socket.localAddress().path()); + } + socket.closeHandler(v2 -> testComplete()); })); - }); + })); await(); } @@ -4324,10 +4333,14 @@ private void testHAProxyProtocolAccepted(Buffer header, SocketAddress remote, So server = vertx.createNetServer(new NetServerOptions() .setUseProxyProtocol(true)) .connectHandler(so -> { - SocketAddress ra = so.remoteAddress(); - SocketAddress la = so.localAddress(); - assertAddresses(remote == null && testAddress.isInetSocket() ? proxy.getConnectionLocalAddress() : remote, ra); - assertAddresses(local == null && testAddress.isInetSocket() ? proxy.getConnectionRemoteAddress() : local, la); + assertAddresses(remote == null && testAddress.isInetSocket() ? + proxy.getConnectionLocalAddress() : + remote, + so.remoteAddress()); + assertAddresses(local == null && testAddress.isInetSocket() ? + proxy.getConnectionRemoteAddress() : + local, + so.localAddress()); complete(); }); startServer();