From d1344345bbd00f245079a2c166b2a4afa1d62668 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Fri, 10 Jul 2015 22:00:30 +0200 Subject: [PATCH] DnsResolver.resolve(...) fails when ipaddress is used. Motivation: DnsResolver.resolve(...) fails when an InetSocketAddress is used that was constructed of an ipaddress string. Modifications: Don't try to lookup when the InetSocketAddress was constructed via an ipaddress. Result: DnsResolver.resolve(...) works in all cases. --- .../io/netty/resolver/dns/DnsNameResolver.java | 16 ++++++++++++---- .../netty/resolver/dns/DnsNameResolverTest.java | 10 ++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolver.java b/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolver.java index d332cb8692..4419b97151 100644 --- a/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolver.java +++ b/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolver.java @@ -38,6 +38,7 @@ import io.netty.handler.codec.dns.DnsResponse; import io.netty.handler.codec.dns.DnsResponseCode; import io.netty.resolver.NameResolver; import io.netty.resolver.SimpleNameResolver; +import io.netty.util.NetUtil; import io.netty.util.ReferenceCountUtil; import io.netty.util.collection.IntObjectHashMap; import io.netty.util.concurrent.Future; @@ -50,6 +51,7 @@ import io.netty.util.internal.logging.InternalLogger; import io.netty.util.internal.logging.InternalLoggerFactory; import java.net.IDN; +import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; @@ -638,12 +640,18 @@ public class DnsNameResolver extends SimpleNameResolver { @Override protected void doResolve(InetSocketAddress unresolvedAddress, Promise promise) throws Exception { - final String hostname = IDN.toASCII(hostname(unresolvedAddress)); - final int port = unresolvedAddress.getPort(); + byte[] bytes = NetUtil.createByteArrayFromIpAddressString(unresolvedAddress.getHostName()); + if (bytes == null) { + final String hostname = IDN.toASCII(hostname(unresolvedAddress)); + final int port = unresolvedAddress.getPort(); - final DnsNameResolverContext ctx = new DnsNameResolverContext(this, hostname, port, promise); + final DnsNameResolverContext ctx = new DnsNameResolverContext(this, hostname, port, promise); - ctx.resolve(); + ctx.resolve(); + } else { + // The unresolvedAddress was created via a String that contains an ipaddress. + promise.setSuccess(new InetSocketAddress(InetAddress.getByAddress(bytes), unresolvedAddress.getPort())); + } } private static String hostname(InetSocketAddress addr) { diff --git a/resolver-dns/src/test/java/io/netty/resolver/dns/DnsNameResolverTest.java b/resolver-dns/src/test/java/io/netty/resolver/dns/DnsNameResolverTest.java index 42a40c57fd..6cbf8e70d1 100644 --- a/resolver-dns/src/test/java/io/netty/resolver/dns/DnsNameResolverTest.java +++ b/resolver-dns/src/test/java/io/netty/resolver/dns/DnsNameResolverTest.java @@ -418,6 +418,16 @@ public class DnsNameResolverTest { } } + @Test + public void testResolveIp() { + InetSocketAddress unresolved = + InetSocketAddress.createUnresolved("10.0.0.1", ThreadLocalRandom.current().nextInt(65536)); + + InetSocketAddress address = resolver.resolve(unresolved).syncUninterruptibly().getNow(); + + assertEquals("10.0.0.1", address.getHostName()); + } + private static void resolve( Map> futures, String hostname) { InetSocketAddress unresolved =