From 8bcde9075a64efa7816f543dda7a82252b0f8a8d Mon Sep 17 00:00:00 2001 From: Aditya Agarwal Date: Mon, 10 Feb 2025 15:14:12 +0530 Subject: [PATCH 1/2] Ignore Ipv6 --- .../io/nats/client/impl/SocketDataPort.java | 45 ++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/nats/client/impl/SocketDataPort.java b/src/main/java/io/nats/client/impl/SocketDataPort.java index f3f546665..cb2807feb 100644 --- a/src/main/java/io/nats/client/impl/SocketDataPort.java +++ b/src/main/java/io/nats/client/impl/SocketDataPort.java @@ -23,12 +23,14 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketException; -import java.net.URISyntaxException; +import java.net.*; import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import static io.nats.client.support.NatsConstants.SECURE_WEBSOCKET_PROTOCOL; @@ -81,7 +83,7 @@ public void connect(NatsConnection conn, NatsUri nuri, long timeoutNanos) throws socket.setTcpNoDelay(true); socket.setReceiveBufferSize(2 * 1024 * 1024); socket.setSendBufferSize(2 * 1024 * 1024); - socket.connect(new InetSocketAddress(host, port), (int) timeout); + socket.connect(new InetSocketAddress(resolveHostToIps(nuri).get(0).getHost(), port), (int) timeout); if (soLinger > -1) { socket.setSoLinger(true, soLinger); } @@ -113,6 +115,39 @@ public void connect(NatsConnection conn, NatsUri nuri, long timeoutNanos) throws } } + private List resolveHostToIps(NatsUri nuri) { + if (nuri.hostIsIpAddress()) { + return Arrays.asList(nuri); + } + try { + InetAddress[] addresses = InetAddress.getAllByName(nuri.getHost()); + return rehostToNUri(Arrays.asList(addresses), nuri); + } catch (UnknownHostException e) { + System.out.println(String.format("[WARN] Ignoring Address %s as Error in resolving host: %s", nuri.getHost(), e.getMessage())); + } + return Arrays.asList(nuri); + } + + + private List rehostToNUri(List inetAddresses, NatsUri nuri) { + List natsUris = new ArrayList<>(); + for (InetAddress addr : inetAddresses) { + try { + if (addr instanceof Inet6Address) { + continue; + } + natsUris.add(nuri.reHost(addr.getHostAddress())); + } catch (URISyntaxException e) { + System.out.println(String.format("[WARN] Ignoring Address %s as Error in while rehostToNri: %s", nuri.getHost(), e.getMessage())); + } + } + if (natsUris.size() < 1) { + natsUris.add(nuri); + } + Collections.shuffle(natsUris, ThreadLocalRandom.current()); + return natsUris; + } + /** * Upgrade the port to SSL. If it is already secured, this is a no-op. * If the data port type doesn't support SSL it should throw an exception. From 8d9a245ec1ddd2bd9eecfa1e30866a248fe96717 Mon Sep 17 00:00:00 2001 From: Aditya Agarwal Date: Wed, 12 Feb 2025 11:34:40 +0530 Subject: [PATCH 2/2] Renamed Vars --- src/main/java/io/nats/client/impl/SocketDataPort.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/nats/client/impl/SocketDataPort.java b/src/main/java/io/nats/client/impl/SocketDataPort.java index cb2807feb..cd6ac2fc3 100644 --- a/src/main/java/io/nats/client/impl/SocketDataPort.java +++ b/src/main/java/io/nats/client/impl/SocketDataPort.java @@ -83,7 +83,7 @@ public void connect(NatsConnection conn, NatsUri nuri, long timeoutNanos) throws socket.setTcpNoDelay(true); socket.setReceiveBufferSize(2 * 1024 * 1024); socket.setSendBufferSize(2 * 1024 * 1024); - socket.connect(new InetSocketAddress(resolveHostToIps(nuri).get(0).getHost(), port), (int) timeout); + socket.connect(new InetSocketAddress(getIpV4Addresses(nuri).get(0).getHost(), port), (int) timeout); if (soLinger > -1) { socket.setSoLinger(true, soLinger); } @@ -115,13 +115,13 @@ public void connect(NatsConnection conn, NatsUri nuri, long timeoutNanos) throws } } - private List resolveHostToIps(NatsUri nuri) { + private List getIpV4Addresses(NatsUri nuri) { if (nuri.hostIsIpAddress()) { return Arrays.asList(nuri); } try { InetAddress[] addresses = InetAddress.getAllByName(nuri.getHost()); - return rehostToNUri(Arrays.asList(addresses), nuri); + return filterIpv6Address(Arrays.asList(addresses), nuri); } catch (UnknownHostException e) { System.out.println(String.format("[WARN] Ignoring Address %s as Error in resolving host: %s", nuri.getHost(), e.getMessage())); } @@ -129,7 +129,7 @@ private List resolveHostToIps(NatsUri nuri) { } - private List rehostToNUri(List inetAddresses, NatsUri nuri) { + private List filterIpv6Address(List inetAddresses, NatsUri nuri) { List natsUris = new ArrayList<>(); for (InetAddress addr : inetAddresses) { try {