From 3461d511f9d06a4a8d411d2b5e0185c6421ebd68 Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 30 Jul 2017 11:40:20 +0200 Subject: [PATCH] Fixed DNS to work with changes from netty 4.1.13 --- src/dorkbox/network/DnsClient.java | 37 ++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/dorkbox/network/DnsClient.java b/src/dorkbox/network/DnsClient.java index 6a44264f..40a798f1 100644 --- a/src/dorkbox/network/DnsClient.java +++ b/src/dorkbox/network/DnsClient.java @@ -19,6 +19,7 @@ import java.net.IDN; import java.net.InetAddress; import java.net.InetSocketAddress; import java.security.AccessControlException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -45,7 +46,6 @@ import dorkbox.util.OS; import dorkbox.util.Property; import dorkbox.util.Version; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufHolder; import io.netty.channel.AddressedEnvelope; import io.netty.channel.EventLoopGroup; import io.netty.channel.ReflectiveChannelFactory; @@ -54,18 +54,22 @@ import io.netty.channel.epoll.EpollEventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.oio.OioEventLoopGroup; import io.netty.channel.socket.DatagramChannel; -import io.netty.channel.socket.InternetProtocolFamily; import io.netty.channel.socket.nio.NioDatagramChannel; import io.netty.channel.socket.oio.OioDatagramChannel; import io.netty.handler.codec.dns.DefaultDnsQuestion; +import io.netty.handler.codec.dns.DnsPtrRecord; +import io.netty.handler.codec.dns.DnsRawRecord; import io.netty.handler.codec.dns.DnsRecord; import io.netty.handler.codec.dns.DnsRecordType; import io.netty.handler.codec.dns.DnsResponse; import io.netty.handler.codec.dns.DnsResponseCode; import io.netty.handler.codec.dns.DnsSection; +import io.netty.resolver.ResolvedAddressTypes; +import io.netty.resolver.dns.DefaultDnsServerAddressStreamProvider; import io.netty.resolver.dns.DnsNameResolver; import io.netty.resolver.dns.DnsNameResolverBuilder; -import io.netty.resolver.dns.DnsServerAddresses; +import io.netty.resolver.dns.DnsServerAddressStreamProvider; +import io.netty.resolver.dns.SequentialDnsServerAddressStreamProvider; import io.netty.util.concurrent.Future; import io.netty.util.internal.PlatformDependent; @@ -96,6 +100,9 @@ class DnsClient { } } + /** + * This is a list of all of the public DNS servers to query, when submitting DNS queries + */ // @formatter:off @Property public static List DNS_SERVER_LIST = Arrays.asList( @@ -108,6 +115,10 @@ class DnsClient { ); // @formatter:on + /** + * This is a list of all of the BOX default DNS servers to query, when submitting DNS queries. + */ + public final static List DEFAULT_DNS_SERVER_LIST = DefaultDnsServerAddressStreamProvider.defaultAddressList(); private static final String ptrSuffix = ".in-addr.arpa"; @@ -215,15 +226,19 @@ class DnsClient { channelType = NioDatagramChannel.class; } + + List list = new ArrayList(nameServerAddresses.size()); + DnsNameResolverBuilder builder = new DnsNameResolverBuilder(eventLoopGroup.next()); builder.channelFactory(new ReflectiveChannelFactory(channelType)) .channelType(channelType) .ttl(minTtl, maxTtl) - .resolvedAddressTypes(InternetProtocolFamily.IPv4) // for now, we only support ipv4 - .nameServerAddresses(DnsServerAddresses.sequential(nameServerAddresses)); + .resolvedAddressTypes(ResolvedAddressTypes.IPV4_ONLY) // for now, we only support ipv4 + .nameServerProvider(new SequentialDnsServerAddressStreamProvider(nameServerAddresses)); resolver = builder.build(); + // A/AAAA use the built-in decoder customDecoders.put(DnsRecordType.MX, new MailExchangerDecoder()); @@ -244,8 +259,7 @@ class DnsClient { */ public String resolve(String hostname) { - if (resolver.resolvedAddressTypes() - .get(0) == InternetProtocolFamily.IPv4) { + if (resolver.resolvedAddressTypes() == ResolvedAddressTypes.IPV4_ONLY) { return resolve(hostname, DnsRecordType.A); } else { @@ -313,8 +327,13 @@ class DnsClient { for (int i = 0; i < answerCount; i++) { final DnsRecord r = response.recordAt(DnsSection.ANSWER, i); if (r.type() == type) { - ByteBuf recordContent = ((ByteBufHolder) r).content(); - return (T) decoder.decode(r, recordContent); + // can be either RAW or it will be a PTR record + if (r instanceof DnsRawRecord) { + ByteBuf recordContent = ((DnsRawRecord) r).content(); + return (T) decoder.decode(r, recordContent); + } else if (r instanceof DnsPtrRecord) { + return (T) ((DnsPtrRecord)r).hostname(); + } } } }