diff --git a/src/main/java/io/vertx/core/datagram/impl/DatagramPacketImpl.java b/src/main/java/io/vertx/core/datagram/impl/DatagramPacketImpl.java index c9acaf0e3..63a2fe099 100644 --- a/src/main/java/io/vertx/core/datagram/impl/DatagramPacketImpl.java +++ b/src/main/java/io/vertx/core/datagram/impl/DatagramPacketImpl.java @@ -23,6 +23,7 @@ import java.net.InetSocketAddress; * @author Norman Maurer */ final class DatagramPacketImpl implements DatagramPacket { + private final InetSocketAddress sender; private final Buffer buffer; private SocketAddress senderAddress; @@ -35,7 +36,7 @@ final class DatagramPacketImpl implements DatagramPacket { @Override public SocketAddress sender() { if (senderAddress == null) { - senderAddress = new SocketAddressImpl(sender.getPort(), sender.getAddress().getHostAddress()); + senderAddress = SocketAddress.inetSocketAddress(sender); } return senderAddress; } diff --git a/src/main/java/io/vertx/core/datagram/impl/DatagramSocketImpl.java b/src/main/java/io/vertx/core/datagram/impl/DatagramSocketImpl.java index f77a37c5f..b9e1e59ad 100644 --- a/src/main/java/io/vertx/core/datagram/impl/DatagramSocketImpl.java +++ b/src/main/java/io/vertx/core/datagram/impl/DatagramSocketImpl.java @@ -243,13 +243,13 @@ public class DatagramSocketImpl implements DatagramSocket, MetricsProvider { @Override public DatagramSocket listen(int port, String address, Handler> handler) { Objects.requireNonNull(handler, "no null handler accepted"); - listen(new SocketAddressImpl(port, address)).setHandler(handler); + listen(SocketAddress.inetSocketAddress(port, address)).setHandler(handler); return this; } @Override public Future listen(int port, String address) { - return listen(new SocketAddressImpl(port, address)); + return listen(SocketAddress.inetSocketAddress(port, address)); } @Override @@ -350,7 +350,7 @@ public class DatagramSocketImpl implements DatagramSocket, MetricsProvider { if (metrics != null) { f2.addListener(fut -> { if (fut.isSuccess()) { - metrics.bytesWritten(null, new SocketAddressImpl(port, host), packet.length()); + metrics.bytesWritten(null, SocketAddress.inetSocketAddress(port, host), packet.length()); } }); } diff --git a/src/main/java/io/vertx/core/http/impl/ConnectionManager.java b/src/main/java/io/vertx/core/http/impl/ConnectionManager.java index 373eae417..a6a7b8656 100644 --- a/src/main/java/io/vertx/core/http/impl/ConnectionManager.java +++ b/src/main/java/io/vertx/core/http/impl/ConnectionManager.java @@ -119,7 +119,7 @@ class ConnectionManager { int maxPoolSize = Math.max(client.getOptions().getMaxPoolSize(), client.getOptions().getHttp2MaxPoolSize()); String host; int port; - if (server.path() == null) { + if (server.isInetSocket()) { host = server.host(); port = server.port(); } else { 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 ce6e2013c..fe2a0eb73 100644 --- a/src/main/java/io/vertx/core/http/impl/HttpServerImpl.java +++ b/src/main/java/io/vertx/core/http/impl/HttpServerImpl.java @@ -223,7 +223,7 @@ public class HttpServerImpl implements HttpServer, Closeable, MetricsProvider { } listenContext = vertx.getOrCreateContext(); listening = true; - String host = address.host() != null ? address.host() : "localhost"; + String host = address.isInetSocket() ? address.host() : "localhost"; int port = address.port(); List applicationProtocols = options.getAlpnVersions(); sslHelper.setApplicationProtocols(applicationProtocols); @@ -236,7 +236,7 @@ public class HttpServerImpl implements HttpServer, Closeable, MetricsProvider { serverChannelGroup = new DefaultChannelGroup("vertx-acceptor-channels", GlobalEventExecutor.INSTANCE); ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(vertx.getAcceptorEventLoopGroup(), availableWorkers); - applyConnectionOptions(address.path() != null, bootstrap); + applyConnectionOptions(address.isDomainSocket(), bootstrap); sslHelper.validate(vertx); String serverOrigin = (options.isSsl() ? "https" : "http") + "://" + host + ":" + port; bootstrap.childHandler(childHandler(address, serverOrigin)); diff --git a/src/main/java/io/vertx/core/net/SocketAddress.java b/src/main/java/io/vertx/core/net/SocketAddress.java index f5194a96e..ba9e6a6a5 100644 --- a/src/main/java/io/vertx/core/net/SocketAddress.java +++ b/src/main/java/io/vertx/core/net/SocketAddress.java @@ -11,9 +11,13 @@ package io.vertx.core.net; +import io.vertx.codegen.annotations.CacheReturn; +import io.vertx.codegen.annotations.GenIgnore; import io.vertx.codegen.annotations.VertxGen; import io.vertx.core.net.impl.SocketAddressImpl; +import java.net.InetSocketAddress; + /** * The address of a socket, an inet socket address or a domain socket address. *

@@ -28,9 +32,13 @@ public interface SocketAddress { /** * Create a inet socket address, {@code host} must be non {@code null} and {@code port} must be between {@code 0} * and {@code 65536}. + *
+ * The {@code host} string can be an host name or an host address. + *
+ * No name resolution will be attempted. * - * @param port the address port - * @param host the address host + * @param port the port + * @param host the host * @return the created socket address */ static SocketAddress inetSocketAddress(int port, String host) { @@ -38,7 +46,7 @@ public interface SocketAddress { } /** - * Create a domain socket address. + * Create a domain socket address from a {@code path}. * * @param path the address path * @return the created socket address @@ -48,18 +56,70 @@ public interface SocketAddress { } /** - * @return the address host or {@code null} for a domain socket + * Create a inet socket address from a Java {@link InetSocketAddress}. + *
+ * No name resolution will be attempted. + * + * @param address the address + * @return the created socket address */ + @GenIgnore(GenIgnore.PERMITTED_TYPE) + static SocketAddress inetSocketAddress(InetSocketAddress address) { + return new SocketAddressImpl(address); + } + + /** + * Returns the host name when available or the IP address in string representation. + *
+ * Domain socket address returns {@code null}. + * + * @return the host address + */ + @CacheReturn String host(); + /** + * Returns the host name when available or {@code null} + *
+ * Domain socket address returns {@code null}. + * + * @return the host name + */ + @CacheReturn + String hostName(); + + /** + * Returns the host IP address when available or {@code null} as a String. + *
+ * Domain socket address returns {@code null}. + * + * @return the host address + */ + @CacheReturn + String hostAddress(); + /** * @return the address port or {@code -1} for a domain socket */ + @CacheReturn int port(); /** - * @return the address path or {@code null} for a inet socket + * @return the domain socket path or {@code null} for a inet socket address. */ + @CacheReturn String path(); + /** + * @return {@code true} for an inet socket address + */ + @CacheReturn + boolean isInetSocket(); + + /** + * @return {@code true} for an domain socket address + */ + @CacheReturn + boolean isDomainSocket(); + } diff --git a/src/main/java/io/vertx/core/net/impl/AsyncResolveConnectHelper.java b/src/main/java/io/vertx/core/net/impl/AsyncResolveConnectHelper.java index bfc47d51c..046ca4181 100644 --- a/src/main/java/io/vertx/core/net/impl/AsyncResolveConnectHelper.java +++ b/src/main/java/io/vertx/core/net/impl/AsyncResolveConnectHelper.java @@ -15,9 +15,13 @@ import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.util.concurrent.Promise; +import io.vertx.core.AsyncResult; +import io.vertx.core.Future; +import io.vertx.core.Handler; import io.vertx.core.impl.VertxInternal; import io.vertx.core.net.SocketAddress; +import java.net.InetAddress; import java.net.InetSocketAddress; /** @@ -25,24 +29,18 @@ import java.net.InetSocketAddress; */ public class AsyncResolveConnectHelper { - private static void checkPort(int port) { - if (port < 0 || port > 65535) { - throw new IllegalArgumentException("Invalid port " + port); - } - } - public static io.netty.util.concurrent.Future doBind(VertxInternal vertx, SocketAddress socketAddress, ServerBootstrap bootstrap) { Promise promise = vertx.getAcceptorEventLoopGroup().next().newPromise(); try { - bootstrap.channelFactory(vertx.transport().serverChannelFactory(socketAddress.path() != null)); + bootstrap.channelFactory(vertx.transport().serverChannelFactory(socketAddress.isDomainSocket())); } catch (Exception e) { promise.setFailure(e); return promise; } - if (socketAddress.path() != null) { - java.net.SocketAddress converted = vertx.transport().convert(socketAddress, true); + if (socketAddress.isDomainSocket()) { + java.net.SocketAddress converted = vertx.transport().convert(socketAddress); ChannelFuture future = bootstrap.bind(converted); future.addListener(f -> { if (f.isSuccess()) { @@ -52,8 +50,8 @@ public class AsyncResolveConnectHelper { } }); } else { - checkPort(socketAddress.port()); - vertx.resolveAddress(socketAddress.host(), res -> { + SocketAddressImpl impl = (SocketAddressImpl) socketAddress; + Handler> cont = res -> { if (res.succeeded()) { // At this point the name is an IP address so there will be no resolve hit InetSocketAddress t = new InetSocketAddress(res.result(), socketAddress.port()); @@ -68,7 +66,12 @@ public class AsyncResolveConnectHelper { } else { promise.setFailure(res.cause()); } - }); + }; + if (impl.ipAddress() != null) { + cont.handle(Future.succeededFuture(impl.ipAddress())); + } else { + vertx.resolveAddress(socketAddress.host(), cont); + } } return promise; } diff --git a/src/main/java/io/vertx/core/net/impl/ChannelProvider.java b/src/main/java/io/vertx/core/net/impl/ChannelProvider.java index 5ce07a0ec..916127c35 100644 --- a/src/main/java/io/vertx/core/net/impl/ChannelProvider.java +++ b/src/main/java/io/vertx/core/net/impl/ChannelProvider.java @@ -78,7 +78,7 @@ public final class ChannelProvider { private void connect(SocketAddress remoteAddress, SocketAddress peerAddress, String serverName, boolean ssl, Promise p) { try { - bootstrap.channelFactory(context.owner().transport().channelFactory(remoteAddress.path() != null)); + bootstrap.channelFactory(context.owner().transport().channelFactory(remoteAddress.isDomainSocket())); } catch (Exception e) { p.setFailure(e); return; @@ -133,7 +133,7 @@ public final class ChannelProvider { initSSL(peerAddress, serverName, ssl, ch, channelHandler); } }); - ChannelFuture fut = bootstrap.connect(vertx.transport().convert(remoteAddress, false)); + ChannelFuture fut = bootstrap.connect(vertx.transport().convert(remoteAddress)); fut.addListener(res -> { if (res.isSuccess()) { connected(fut.channel(), ssl, channelHandler); @@ -193,7 +193,7 @@ public final class ChannelProvider { } bootstrap.resolver(NoopAddressResolverGroup.INSTANCE); - java.net.SocketAddress targetAddress = vertx.transport().convert(remoteAddress, false); + java.net.SocketAddress targetAddress = vertx.transport().convert(remoteAddress); bootstrap.handler(new ChannelInitializer() { @Override diff --git a/src/main/java/io/vertx/core/net/impl/NetClientImpl.java b/src/main/java/io/vertx/core/net/impl/NetClientImpl.java index f665c72f3..cc4b07778 100644 --- a/src/main/java/io/vertx/core/net/impl/NetClientImpl.java +++ b/src/main/java/io/vertx/core/net/impl/NetClientImpl.java @@ -198,7 +198,7 @@ public class NetClientImpl implements MetricsProvider, NetClient { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(context.nettyEventLoop()); - applyConnectionOptions(remoteAddress.path() != null, bootstrap); + applyConnectionOptions(remoteAddress.isDomainSocket(), bootstrap); ChannelProvider channelProvider = new ChannelProvider(bootstrap, sslHelper, context, options.getProxyOptions()); diff --git a/src/main/java/io/vertx/core/net/impl/NetServerImpl.java b/src/main/java/io/vertx/core/net/impl/NetServerImpl.java index c1e2fb683..f03cc6c82 100644 --- a/src/main/java/io/vertx/core/net/impl/NetServerImpl.java +++ b/src/main/java/io/vertx/core/net/impl/NetServerImpl.java @@ -201,7 +201,7 @@ public class NetServerImpl implements Closeable, MetricsProvider, NetServer { Map sharedNetServers = vertx.sharedNetServers(); synchronized (sharedNetServers) { this.actualPort = localAddress.port(); // Will be updated on bind for a wildcard port - String hostOrPath = localAddress.host() != null ? localAddress.host() : localAddress.path(); + String hostOrPath = localAddress.isInetSocket() ? localAddress.host() : localAddress.path(); id = new ServerID(actualPort, hostOrPath); NetServerImpl shared = sharedNetServers.get(id); if (shared == null || actualPort == 0) { // Wildcard port will imply a new actual server each time @@ -250,7 +250,7 @@ public class NetServerImpl implements Closeable, MetricsProvider, NetServer { } }); - applyConnectionOptions(localAddress.path() != null, bootstrap); + applyConnectionOptions(localAddress.isDomainSocket(), bootstrap); handlerManager.addHandler(new Handlers(this, handler, exceptionHandler), listenContext); @@ -271,7 +271,7 @@ public class NetServerImpl implements Closeable, MetricsProvider, NetServer { } VertxMetrics metrics = vertx.metricsSPI(); if (metrics != null) { - this.metrics = metrics.createNetServerMetrics(options, new SocketAddressImpl(id.port, id.host)); + this.metrics = metrics.createNetServerMetrics(options, SocketAddress.inetSocketAddress(id.port, id.host)); } } else { synchronized (sharedNetServers) { @@ -293,7 +293,7 @@ public class NetServerImpl implements Closeable, MetricsProvider, NetServer { actualServer = shared; this.actualPort = shared.actualPort(); VertxMetrics metrics = vertx.metricsSPI(); - this.metrics = metrics != null ? metrics.createNetServerMetrics(options, new SocketAddressImpl(id.port, id.host)) : null; + this.metrics = metrics != null ? metrics.createNetServerMetrics(options, SocketAddress.inetSocketAddress(id.port, id.host)) : null; actualServer.handlerManager.addHandler(new Handlers(this, handler, exceptionHandler), listenContext); } diff --git a/src/main/java/io/vertx/core/net/impl/SSLHelper.java b/src/main/java/io/vertx/core/net/impl/SSLHelper.java index 8443b65b9..2b226d0b8 100755 --- a/src/main/java/io/vertx/core/net/impl/SSLHelper.java +++ b/src/main/java/io/vertx/core/net/impl/SSLHelper.java @@ -513,7 +513,7 @@ public class SSLHelper { public SSLEngine createEngine(VertxInternal vertx, SocketAddress socketAddress, String serverName) { SslContext context = getContext(vertx, null); SSLEngine engine; - if (socketAddress.path() != null) { + if (socketAddress.isDomainSocket()) { engine = context.newEngine(ByteBufAllocator.DEFAULT); } else { engine = context.newEngine(ByteBufAllocator.DEFAULT, socketAddress.host(), socketAddress.port()); 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 192be94dd..fdc2d699f 100644 --- a/src/main/java/io/vertx/core/net/impl/SocketAddressImpl.java +++ b/src/main/java/io/vertx/core/net/impl/SocketAddressImpl.java @@ -11,10 +11,15 @@ package io.vertx.core.net.impl; +import io.netty.util.NetUtil; +import io.vertx.core.VertxException; import io.vertx.core.impl.Arguments; import io.vertx.core.net.SocketAddress; +import java.net.Inet6Address; +import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.UnknownHostException; import java.util.Objects; /** @@ -22,22 +27,64 @@ import java.util.Objects; */ public class SocketAddressImpl implements SocketAddress{ - private final String hostAddress; + private final String host; + private final String hostName; + private final InetAddress ipAddress; private final int port; private final String path; - public SocketAddressImpl(int port, String host) { - Objects.requireNonNull(host, "no null host accepted"); - Arguments.require(!host.isEmpty(), "no empty host accepted"); - Arguments.requireInRange(port, 0, 65535, "port p must be in range 0 <= p <= 65535"); - this.port = port; - this.hostAddress = host; + public SocketAddressImpl(InetSocketAddress address) { + Arguments.requireInRange(address.getPort(), 0, 65535, "port p must be in range 0 <= p <= 65535"); this.path = null; + this.port= address.getPort(); + this.host = address.getHostString(); + if (address.isUnresolved()) { + this.hostName = address.getHostName(); + this.ipAddress = null; + } else { + String host = address.getHostString(); + if (NetUtil.isValidIpV4Address(host) || NetUtil.isValidIpV6Address(host)) { + host = null; + } + this.hostName = host; + this.ipAddress = address.getAddress(); + } + } + + public SocketAddressImpl(int port, String host) { + Arguments.requireInRange(port, 0, 65535, "port p must be in range 0 <= p <= 65535"); + this.path = null; + this.port = port; + if (NetUtil.isValidIpV4Address(host)) { + InetAddress ip; + try { + ip = InetAddress.getByAddress(NetUtil.createByteArrayFromIpAddressString(host)); + } catch (UnknownHostException e) { + throw new VertxException(e); + } + this.host = host; + this.hostName = null; + this.ipAddress = ip; + } else if (NetUtil.isValidIpV6Address(host)) { + Inet6Address ip = NetUtil.getByName(host); + this.host = host; + this.hostName = null; + this.ipAddress = ip; + } else { + Arguments.require(!host.isEmpty(), "host name must not be empty"); + this.host = host; + this.hostName = host; + this.ipAddress = null; + } } 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.hostAddress = null; + this.host = null; + this.ipAddress = null; + this.hostName = null; this.path = path; } @@ -47,21 +94,45 @@ public class SocketAddressImpl implements SocketAddress{ } public String host() { - return hostAddress; + return host; + } + + @Override + public String hostName() { + return hostName; + } + + @Override + public String hostAddress() { + return ipAddress == null ? null : ipAddress.getHostAddress(); } public int port() { return port; } + @Override + public boolean isInetSocket() { + return path == null; + } + + @Override + public boolean isDomainSocket() { + return path != null; + } + public String toString() { if (path == null) { - return hostAddress + ":" + port; + return host + ":" + port; } else { return path; } } + public InetAddress ipAddress() { + return ipAddress; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -70,7 +141,7 @@ public class SocketAddressImpl implements SocketAddress{ SocketAddressImpl that = (SocketAddressImpl) o; if (port != that.port) return false; - if (hostAddress != null ? !hostAddress.equals(that.hostAddress) : that.hostAddress != null) return false; + if (host != null ? !host.equals(that.host) : that.host != null) return false; if (path != null ? !path.equals(that.path) : that.path != null) return false; return true; @@ -78,7 +149,7 @@ public class SocketAddressImpl implements SocketAddress{ @Override public int hashCode() { - int result = hostAddress != null ? hostAddress.hashCode() : 0; + int result = host != null ? host.hashCode() : 0; result = 31 * result + (path != null ? path.hashCode() : 0); result = 31 * result + port; return result; diff --git a/src/main/java/io/vertx/core/net/impl/transport/EpollTransport.java b/src/main/java/io/vertx/core/net/impl/transport/EpollTransport.java index bb21007dc..b3fc0da8c 100644 --- a/src/main/java/io/vertx/core/net/impl/transport/EpollTransport.java +++ b/src/main/java/io/vertx/core/net/impl/transport/EpollTransport.java @@ -66,15 +66,11 @@ class EpollTransport extends Transport { } @Override - public SocketAddress convert(io.vertx.core.net.SocketAddress address, boolean resolved) { - if (address.path() != null) { + public SocketAddress convert(io.vertx.core.net.SocketAddress address) { + if (address.isDomainSocket()) { return new DomainSocketAddress(address.path()); } else { - if (resolved) { - return new InetSocketAddress(address.host(), address.port()); - } else { - return InetSocketAddress.createUnresolved(address.host(), address.port()); - } + return super.convert(address); } } diff --git a/src/main/java/io/vertx/core/net/impl/transport/KQueueTransport.java b/src/main/java/io/vertx/core/net/impl/transport/KQueueTransport.java index f9d4a7a51..383057193 100644 --- a/src/main/java/io/vertx/core/net/impl/transport/KQueueTransport.java +++ b/src/main/java/io/vertx/core/net/impl/transport/KQueueTransport.java @@ -37,15 +37,11 @@ class KQueueTransport extends Transport { } @Override - public SocketAddress convert(io.vertx.core.net.SocketAddress address, boolean resolved) { - if (address.path() != null) { + public SocketAddress convert(io.vertx.core.net.SocketAddress address) { + if (address.isDomainSocket()) { return new DomainSocketAddress(address.path()); } else { - if (resolved) { - return new InetSocketAddress(address.host(), address.port()); - } else { - return InetSocketAddress.createUnresolved(address.host(), address.port()); - } + return super.convert(address); } } diff --git a/src/main/java/io/vertx/core/net/impl/transport/Transport.java b/src/main/java/io/vertx/core/net/impl/transport/Transport.java index cc6e52ec8..0ce2f93c4 100644 --- a/src/main/java/io/vertx/core/net/impl/transport/Transport.java +++ b/src/main/java/io/vertx/core/net/impl/transport/Transport.java @@ -26,6 +26,7 @@ import io.vertx.core.net.NetServerOptions; import io.vertx.core.net.impl.PartialPooledByteBufAllocator; import io.vertx.core.net.impl.SocketAddressImpl; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.NetworkInterface; import java.net.SocketAddress; @@ -106,12 +107,13 @@ public class Transport { return null; } - public SocketAddress convert(io.vertx.core.net.SocketAddress address, boolean resolved) { - if (address.path() != null) { + public SocketAddress convert(io.vertx.core.net.SocketAddress address) { + if (address.isDomainSocket()) { throw new IllegalArgumentException("Domain socket not supported by JDK transport"); } else { - if (resolved) { - return new InetSocketAddress(address.host(), address.port()); + InetAddress ip = ((SocketAddressImpl) address).ipAddress(); + if (ip != null) { + return new InetSocketAddress(ip, address.port()); } else { return InetSocketAddress.createUnresolved(address.host(), address.port()); } @@ -120,12 +122,7 @@ public class Transport { public io.vertx.core.net.SocketAddress convert(SocketAddress address) { if (address instanceof InetSocketAddress) { - InetSocketAddress inetSocketAddress = (InetSocketAddress) address; - if (inetSocketAddress.isUnresolved()) { - return new SocketAddressImpl(inetSocketAddress.getPort(), inetSocketAddress.getHostName()); - } else { - return new SocketAddressImpl(inetSocketAddress.getPort(), inetSocketAddress.getAddress().getHostAddress()); - } + return io.vertx.core.net.SocketAddress.inetSocketAddress((InetSocketAddress) address); } else { return null; } diff --git a/src/test/java/io/vertx/core/http/Http1xTest.java b/src/test/java/io/vertx/core/http/Http1xTest.java index d6542e733..e1edefaa9 100644 --- a/src/test/java/io/vertx/core/http/Http1xTest.java +++ b/src/test/java/io/vertx/core/http/Http1xTest.java @@ -1006,7 +1006,7 @@ public class Http1xTest extends HttpTest { @Test public void testTimedOutWaiterDoesntConnect() throws Exception { - Assume.assumeTrue("Domain socket don't pass this test", testAddress.path() == null); + Assume.assumeTrue("Domain socket don't pass this test", testAddress.isInetSocket()); long responseDelay = 300; int requests = 6; client.close(); @@ -2823,7 +2823,7 @@ public class Http1xTest extends HttpTest { Handler connectHandler ) throws Exception { // Cannot reliably pass due to https://github.com/netty/netty/issues/9113 - Assume.assumeTrue(testAddress.path() == null); + Assume.assumeTrue(testAddress.isInetSocket()); client.close(); server.close(); diff --git a/src/test/java/io/vertx/core/http/HttpTest.java b/src/test/java/io/vertx/core/http/HttpTest.java index 6c73dfd79..0f02c9b3f 100644 --- a/src/test/java/io/vertx/core/http/HttpTest.java +++ b/src/test/java/io/vertx/core/http/HttpTest.java @@ -2593,7 +2593,7 @@ public abstract class HttpTest extends HttpTestBase { @Test public void testRemoteAddress() { server.requestHandler(req -> { - if (testAddress.host() != null) { + if (testAddress.isInetSocket()) { assertEquals("127.0.0.1", req.remoteAddress().host()); } else { // Returns null for domain sockets diff --git a/src/test/java/io/vertx/core/net/NetTest.java b/src/test/java/io/vertx/core/net/NetTest.java index dbb3e8d2a..898e5ad5a 100755 --- a/src/test/java/io/vertx/core/net/NetTest.java +++ b/src/test/java/io/vertx/core/net/NetTest.java @@ -738,14 +738,6 @@ public class NetTest extends VertxTestBase { assertTrue(options.getKeyCertOptions() instanceof PemKeyCertOptions); } - @Test - public void testSocketAddress() throws Exception { - assertNullPointerException(() -> new SocketAddressImpl(0, null)); - assertIllegalArgumentException(() -> new SocketAddressImpl(0, "")); - assertIllegalArgumentException(() -> new SocketAddressImpl(-1, "someHost")); - assertIllegalArgumentException(() -> new SocketAddressImpl(65536, "someHost")); - } - @Test public void testWriteHandlerSuccess() throws Exception { CompletableFuture close = new CompletableFuture<>(); @@ -1737,7 +1729,7 @@ public class NetTest extends VertxTestBase { // To get this to reliably pass with a lot of connections. public void testSharedServersRoundRobin() throws Exception { - boolean domainSocket = testAddress.path() != null; + boolean domainSocket = testAddress.isDomainSocket(); int numServers = VertxOptions.DEFAULT_EVENT_LOOP_POOL_SIZE / 2- 1; int numConnections = numServers * (domainSocket ? 10 : 20); @@ -1896,12 +1888,16 @@ public class NetTest extends VertxTestBase { 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()); socket.close(); }).listen(1234, "localhost", ar -> { assertTrue(ar.succeeded()); vertx.createNetClient(new NetClientOptions()).connect(1234, "localhost", onSuccess(socket -> { SocketAddress addr = socket.remoteAddress(); - assertEquals("127.0.0.1", addr.host()); + assertEquals("localhost", addr.host()); + assertEquals("localhost", addr.hostName()); + assertEquals("127.0.0.1", addr.hostAddress()); assertEquals(addr.port(), 1234); socket.closeHandler(v -> testComplete()); })); diff --git a/src/test/java/io/vertx/core/net/SocketAddressTest.java b/src/test/java/io/vertx/core/net/SocketAddressTest.java new file mode 100644 index 000000000..ff250bbc4 --- /dev/null +++ b/src/test/java/io/vertx/core/net/SocketAddressTest.java @@ -0,0 +1,115 @@ +package io.vertx.core.net; + +import io.netty.util.NetUtil; +import io.vertx.test.core.VertxTestBase; +import org.junit.Test; + +import java.net.InetAddress; +import java.net.InetSocketAddress; + +import static io.vertx.test.core.TestUtils.assertIllegalArgumentException; +import static io.vertx.test.core.TestUtils.assertNullPointerException; + +public class SocketAddressTest extends VertxTestBase { + + @Test + public void testInetSocketAddressFromUnresolvedAddress() { + SocketAddress addr = SocketAddress.inetSocketAddress(InetSocketAddress.createUnresolved("localhost", 8080)); + assertEquals("localhost", addr.host()); + assertEquals("localhost", addr.hostName()); + assertEquals(null, addr.hostAddress()); + assertEquals(8080, addr.port()); + assertFalse(addr.isDomainSocket()); + assertTrue(addr.isInetSocket()); + } + + @Test + public void testInetSocketAddressFromResolvedAddress() { + InetSocketAddress expected = new InetSocketAddress("localhost", 8080); + SocketAddress addr = SocketAddress.inetSocketAddress(expected); + assertEquals("localhost", addr.host()); + assertEquals("localhost", addr.hostName()); + assertEquals(expected.getAddress().getHostAddress(), addr.hostAddress()); + assertEquals(8080, addr.port()); + assertFalse(addr.isDomainSocket()); + assertTrue(addr.isInetSocket()); + } + + @Test + public void testInetSocketAddressIpV4Address() throws Exception { + InetAddress ip = InetAddress.getByAddress(new byte[]{127, 0, 0, 1}); + SocketAddress addr = SocketAddress.inetSocketAddress(new InetSocketAddress(ip, 8080)); + assertEquals("127.0.0.1", addr.host()); + assertNull(addr.hostName()); + assertEquals(ip.getHostAddress(), addr.hostAddress()); + assertEquals(8080, addr.port()); + assertFalse(addr.isDomainSocket()); + assertTrue(addr.isInetSocket()); + } + + @Test + public void testInetSocketAddressIpV6Address() { + InetAddress ip = NetUtil.getByName("::1"); + SocketAddress addr = SocketAddress.inetSocketAddress(new InetSocketAddress(ip, 8080)); + assertEquals("0:0:0:0:0:0:0:1", addr.host()); + assertNull(addr.hostName()); + assertEquals(ip.getHostAddress(), addr.hostAddress()); + assertEquals(8080, addr.port()); + assertFalse(addr.isDomainSocket()); + assertTrue(addr.isInetSocket()); + } + + @Test + public void testInetSocketAddressFromHostName() { + SocketAddress addr = SocketAddress.inetSocketAddress(8080, "localhost"); + assertEquals("localhost", addr.host()); + assertEquals("localhost", addr.hostName()); + assertNull(addr.hostAddress()); + assertEquals(8080, addr.port()); + assertFalse(addr.isDomainSocket()); + assertTrue(addr.isInetSocket()); + } + + @Test + public void testInetSocketAddressFromIpV4AddressHost() { + SocketAddress addr = SocketAddress.inetSocketAddress(8080, "127.0.0.1"); + assertEquals("127.0.0.1", addr.host()); + assertEquals(null, addr.hostName()); + assertEquals("127.0.0.1", addr.hostAddress()); + assertEquals(8080, addr.port()); + assertFalse(addr.isDomainSocket()); + assertTrue(addr.isInetSocket()); + } + + @Test + public void testInetSocketAddressFromIpV6AddressHost() { + SocketAddress addr = SocketAddress.inetSocketAddress(8080, "::1"); + assertEquals("::1", addr.host()); + assertEquals(null, addr.hostName()); + assertEquals("0:0:0:0:0:0:0:1", addr.hostAddress()); + assertEquals(8080, addr.port()); + assertFalse(addr.isDomainSocket()); + assertTrue(addr.isInetSocket()); + } + + @Test + public void testDomainSocketAddress() { + SocketAddress addr = SocketAddress.domainSocketAddress("/foo"); + assertEquals("/foo", addr.path()); + assertNull(addr.host()); + assertNull(addr.hostAddress()); + assertNull(addr.hostName()); + assertEquals(-1, addr.port()); + assertTrue(addr.isDomainSocket()); + assertFalse(addr.isInetSocket()); + } + + @Test + public void testSocketAddress() throws Exception { + assertNullPointerException(() -> SocketAddress.domainSocketAddress(null)); + assertNullPointerException(() -> SocketAddress.inetSocketAddress(0, null)); + assertIllegalArgumentException(() -> SocketAddress.inetSocketAddress(0, "")); + assertIllegalArgumentException(() -> SocketAddress.inetSocketAddress(-1, "someHost")); + assertIllegalArgumentException(() -> SocketAddress.inetSocketAddress(65536, "someHost")); + } +}