@UnstableApi public class DnsNameResolver extends InetNameResolver
InetNameResolver
.Modifier and Type | Class and Description |
---|---|
private class |
DnsNameResolver.DnsResponseHandler |
(package private) static class |
DnsNameResolver.ListResolverContext |
(package private) static class |
DnsNameResolver.SingleResolverContext |
Constructor and Description |
---|
DnsNameResolver(EventLoop eventLoop,
ChannelFactory<? extends DatagramChannel> channelFactory,
DnsCache resolveCache,
DnsCache authoritativeDnsServerCache,
DnsQueryLifecycleObserverFactory dnsQueryLifecycleObserverFactory,
long queryTimeoutMillis,
ResolvedAddressTypes resolvedAddressTypes,
boolean recursionDesired,
int maxQueriesPerResolve,
boolean traceEnabled,
int maxPayloadSize,
boolean optResourceEnabled,
HostsFileEntriesResolver hostsFileEntriesResolver,
DnsServerAddressStreamProvider dnsServerAddressStreamProvider,
java.lang.String[] searchDomains,
int ndots,
boolean decodeIdn)
Creates a new DNS-based name resolver that communicates with the specified list of DNS servers.
|
Modifier and Type | Method and Description |
---|---|
DnsCache |
authoritativeDnsServerCache()
Returns the cache used for authoritative DNS servers for a domain.
|
private static Promise<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
cast(Promise<?> promise) |
void |
close()
Closes the internal datagram channel used for sending and receiving DNS messages, and clears all DNS resource
records from the cache.
|
(package private) DnsQueryLifecycleObserverFactory |
dnsQueryLifecycleObserverFactory() |
(package private) int |
dnsRedirectPort(java.net.InetAddress server) |
protected void |
doResolve(java.lang.String inetHost,
DnsRecord[] additionals,
Promise<java.net.InetAddress> promise,
DnsCache resolveCache)
Hook designed for extensibility so one can pass a different cache on each resolution attempt
instead of using the global one.
|
protected void |
doResolve(java.lang.String inetHost,
Promise<java.net.InetAddress> promise)
Invoked by
SimpleNameResolver.resolve(String) to perform the actual name resolution. |
protected void |
doResolveAll(java.lang.String inetHost,
DnsRecord[] additionals,
Promise<java.util.List<java.net.InetAddress>> promise,
DnsCache resolveCache)
Hook designed for extensibility so one can pass a different cache on each resolution attempt
instead of using the global one.
|
protected void |
doResolveAll(java.lang.String inetHost,
Promise<java.util.List<java.net.InetAddress>> promise)
Invoked by
SimpleNameResolver.resolveAll(String) to perform the actual name resolution. |
private boolean |
doResolveAllCached(java.lang.String hostname,
DnsRecord[] additionals,
Promise<java.util.List<java.net.InetAddress>> promise,
DnsCache resolveCache) |
private void |
doResolveAllUncached(java.lang.String hostname,
DnsRecord[] additionals,
Promise<java.util.List<java.net.InetAddress>> promise,
DnsCache resolveCache) |
private boolean |
doResolveCached(java.lang.String hostname,
DnsRecord[] additionals,
Promise<java.net.InetAddress> promise,
DnsCache resolveCache) |
private void |
doResolveUncached(java.lang.String hostname,
DnsRecord[] additionals,
Promise<java.net.InetAddress> promise,
DnsCache resolveCache) |
protected EventLoop |
executor()
Returns the
EventExecutor which is used to notify the listeners of the Future returned
by SimpleNameResolver.resolve(String) . |
private static java.lang.String |
hostname(java.lang.String inetHost) |
HostsFileEntriesResolver |
hostsFileEntriesResolver()
Returns the component that tries to resolve hostnames against the hosts file prior to asking to
remotes DNS servers.
|
(package private) boolean |
isDecodeIdn() |
boolean |
isOptResourceEnabled()
Returns the automatic inclusion of a optional records that tries to give the remote DNS server a hint about how
much data the resolver can read per response is enabled.
|
boolean |
isRecursionDesired()
Returns
true if and only if this resolver sends a DNS query with the RD (recursion desired) flag set. |
private java.net.InetAddress |
loopbackAddress() |
int |
maxPayloadSize()
Returns the capacity of the datagram packet buffer (in bytes).
|
int |
maxQueriesPerResolve()
Returns the maximum allowed number of DNS queries to send when resolving a host name.
|
(package private) int |
ndots() |
private java.net.InetSocketAddress |
nextNameServerAddress() |
(package private) InternetProtocolFamily |
preferredAddressType() |
Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
query(DnsQuestion question)
Sends a DNS query with the specified question.
|
Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
query(DnsQuestion question,
java.lang.Iterable<DnsRecord> additionals)
Sends a DNS query with the specified question with additional records.
|
Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
query(DnsQuestion question,
Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise)
Sends a DNS query with the specified question.
|
Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
query(java.net.InetSocketAddress nameServerAddr,
DnsQuestion question)
Sends a DNS query with the specified question using the specified name server list.
|
Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
query(java.net.InetSocketAddress nameServerAddr,
DnsQuestion question,
java.lang.Iterable<DnsRecord> additionals)
Sends a DNS query with the specified question with additional records using the specified name server list.
|
Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
query(java.net.InetSocketAddress nameServerAddr,
DnsQuestion question,
java.lang.Iterable<DnsRecord> additionals,
Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise)
Sends a DNS query with the specified question with additional records using the specified name server list.
|
Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
query(java.net.InetSocketAddress nameServerAddr,
DnsQuestion question,
Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise)
Sends a DNS query with the specified question using the specified name server list.
|
(package private) Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
query0(java.net.InetSocketAddress nameServerAddr,
DnsQuestion question,
DnsRecord[] additionals,
ChannelPromise writePromise,
Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise) |
(package private) Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> |
query0(java.net.InetSocketAddress nameServerAddr,
DnsQuestion question,
DnsRecord[] additionals,
Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise) |
long |
queryTimeoutMillis()
Returns the timeout of each DNS query performed by this resolver (in milliseconds).
|
Future<java.net.InetAddress> |
resolve(java.lang.String inetHost,
java.lang.Iterable<DnsRecord> additionals)
Resolves the specified name into an address.
|
Future<java.net.InetAddress> |
resolve(java.lang.String inetHost,
java.lang.Iterable<DnsRecord> additionals,
Promise<java.net.InetAddress> promise)
Resolves the specified name into an address.
|
Future<java.util.List<java.net.InetAddress>> |
resolveAll(java.lang.String inetHost,
java.lang.Iterable<DnsRecord> additionals)
Resolves the specified host name and port into a list of address.
|
Future<java.util.List<java.net.InetAddress>> |
resolveAll(java.lang.String inetHost,
java.lang.Iterable<DnsRecord> additionals,
Promise<java.util.List<java.net.InetAddress>> promise)
Resolves the specified host name and port into a list of address.
|
DnsCache |
resolveCache()
Returns the resolution cache.
|
ResolvedAddressTypes |
resolvedAddressTypes()
Returns the
ResolvedAddressTypes resolved by SimpleNameResolver.resolve(String) . |
(package private) InternetProtocolFamily[] |
resolvedInternetProtocolFamiliesUnsafe() |
private java.net.InetAddress |
resolveHostsFileEntry(java.lang.String hostname) |
(package private) DnsRecordType[] |
resolveRecordTypes() |
(package private) java.lang.String[] |
searchDomains() |
(package private) boolean |
supportsAAAARecords() |
(package private) boolean |
supportsARecords() |
private static DnsRecord[] |
toArray(java.lang.Iterable<DnsRecord> additionals,
boolean validateType) |
private static void |
tryFailure(Promise<?> promise,
java.lang.Throwable cause) |
private static <T> void |
trySuccess(Promise<T> promise,
T result) |
protected DnsServerAddressStream |
uncachedRedirectDnsServerStream(java.util.List<java.net.InetSocketAddress> nameServers)
Provides the opportunity to sort the name servers before following a redirected DNS query.
|
private static void |
validateAdditional(DnsRecord record,
boolean validateType) |
asAddressResolver
resolve, resolve, resolveAll, resolveAll
private static final InternalLogger logger
private static final java.lang.String LOCALHOST
private static final java.net.InetAddress LOCALHOST_ADDRESS
private static final DnsRecord[] EMPTY_ADDITIONALS
private static final DnsRecordType[] IPV4_ONLY_RESOLVED_RECORD_TYPES
private static final InternetProtocolFamily[] IPV4_ONLY_RESOLVED_PROTOCOL_FAMILIES
private static final DnsRecordType[] IPV4_PREFERRED_RESOLVED_RECORD_TYPES
private static final InternetProtocolFamily[] IPV4_PREFERRED_RESOLVED_PROTOCOL_FAMILIES
private static final DnsRecordType[] IPV6_ONLY_RESOLVED_RECORD_TYPES
private static final InternetProtocolFamily[] IPV6_ONLY_RESOLVED_PROTOCOL_FAMILIES
private static final DnsRecordType[] IPV6_PREFERRED_RESOLVED_RECORD_TYPES
private static final InternetProtocolFamily[] IPV6_PREFERRED_RESOLVED_PROTOCOL_FAMILIES
static final ResolvedAddressTypes DEFAULT_RESOLVE_ADDRESS_TYPES
static final java.lang.String[] DEFAULT_SEARCH_DOMAINS
private static final int DEFAULT_NDOTS
private static final DatagramDnsResponseDecoder DECODER
private static final DatagramDnsQueryEncoder ENCODER
final DatagramChannel ch
final DnsQueryContextManager queryContextManager
DnsQueryContext
s in progress and their query IDs.private final DnsCache resolveCache
doResolve(String, Promise)
and doResolveAll(String, Promise)
.private final DnsCache authoritativeDnsServerCache
private final FastThreadLocal<DnsServerAddressStream> nameServerAddrStream
private final long queryTimeoutMillis
private final int maxQueriesPerResolve
private final ResolvedAddressTypes resolvedAddressTypes
private final InternetProtocolFamily[] resolvedInternetProtocolFamilies
private final boolean recursionDesired
private final int maxPayloadSize
private final boolean optResourceEnabled
private final HostsFileEntriesResolver hostsFileEntriesResolver
private final DnsServerAddressStreamProvider dnsServerAddressStreamProvider
private final java.lang.String[] searchDomains
private final int ndots
private final boolean supportsAAAARecords
private final boolean supportsARecords
private final InternetProtocolFamily preferredAddressType
private final DnsRecordType[] resolveRecordTypes
private final boolean decodeIdn
private final DnsQueryLifecycleObserverFactory dnsQueryLifecycleObserverFactory
public DnsNameResolver(EventLoop eventLoop, ChannelFactory<? extends DatagramChannel> channelFactory, DnsCache resolveCache, DnsCache authoritativeDnsServerCache, DnsQueryLifecycleObserverFactory dnsQueryLifecycleObserverFactory, long queryTimeoutMillis, ResolvedAddressTypes resolvedAddressTypes, boolean recursionDesired, int maxQueriesPerResolve, boolean traceEnabled, int maxPayloadSize, boolean optResourceEnabled, HostsFileEntriesResolver hostsFileEntriesResolver, DnsServerAddressStreamProvider dnsServerAddressStreamProvider, java.lang.String[] searchDomains, int ndots, boolean decodeIdn)
eventLoop
- the EventLoop
which will perform the communication with the DNS serverschannelFactory
- the ChannelFactory
that will create a DatagramChannel
resolveCache
- the DNS resolved entries cacheauthoritativeDnsServerCache
- the cache used to find the authoritative DNS server for a domaindnsQueryLifecycleObserverFactory
- used to generate new instances of DnsQueryLifecycleObserver
which
can be used to track metrics for DNS servers.queryTimeoutMillis
- timeout of each DNS query in millisresolvedAddressTypes
- the preferred address typesrecursionDesired
- if recursion desired flag must be setmaxQueriesPerResolve
- the maximum allowed number of DNS queries for a given name resolutiontraceEnabled
- if trace is enabledmaxPayloadSize
- the capacity of the datagram packet bufferoptResourceEnabled
- if automatic inclusion of a optional records is enabledhostsFileEntriesResolver
- the HostsFileEntriesResolver
used to check for local aliasesdnsServerAddressStreamProvider
- The DnsServerAddressStreamProvider
used to determine the name
servers for each hostname lookup.searchDomains
- the list of search domain
(can be null, if so, will try to default to the underlying platform ones)ndots
- the ndots valuedecodeIdn
- true
if domain / host names should be decoded to unicode when received.
See rfc3492.int dnsRedirectPort(java.net.InetAddress server)
final DnsQueryLifecycleObserverFactory dnsQueryLifecycleObserverFactory()
protected DnsServerAddressStream uncachedRedirectDnsServerStream(java.util.List<java.net.InetSocketAddress> nameServers)
nameServers
- The addresses of the DNS servers which are used in the event of a redirect.DnsServerAddressStream
which will be used to follow the DNS redirect.public DnsCache resolveCache()
public DnsCache authoritativeDnsServerCache()
public long queryTimeoutMillis()
public ResolvedAddressTypes resolvedAddressTypes()
ResolvedAddressTypes
resolved by SimpleNameResolver.resolve(String)
.
The default value depends on the value of the system property "java.net.preferIPv6Addresses"
.InternetProtocolFamily[] resolvedInternetProtocolFamiliesUnsafe()
final java.lang.String[] searchDomains()
final int ndots()
final boolean supportsAAAARecords()
final boolean supportsARecords()
final InternetProtocolFamily preferredAddressType()
final DnsRecordType[] resolveRecordTypes()
final boolean isDecodeIdn()
public boolean isRecursionDesired()
true
if and only if this resolver sends a DNS query with the RD (recursion desired) flag set.
The default value is true
.public int maxQueriesPerResolve()
8
.public int maxPayloadSize()
4096
bytes.public boolean isOptResourceEnabled()
public HostsFileEntriesResolver hostsFileEntriesResolver()
public void close()
close
in interface NameResolver<java.net.InetAddress>
close
in interface java.io.Closeable
close
in interface java.lang.AutoCloseable
close
in class SimpleNameResolver<java.net.InetAddress>
protected EventLoop executor()
SimpleNameResolver
EventExecutor
which is used to notify the listeners of the Future
returned
by SimpleNameResolver.resolve(String)
.executor
in class SimpleNameResolver<java.net.InetAddress>
private java.net.InetAddress resolveHostsFileEntry(java.lang.String hostname)
public final Future<java.net.InetAddress> resolve(java.lang.String inetHost, java.lang.Iterable<DnsRecord> additionals)
inetHost
- the name to resolveadditionals
- additional records (OPT
)public final Future<java.net.InetAddress> resolve(java.lang.String inetHost, java.lang.Iterable<DnsRecord> additionals, Promise<java.net.InetAddress> promise)
inetHost
- the name to resolveadditionals
- additional records (OPT
)promise
- the Promise
which will be fulfilled when the name resolution is finishedpublic final Future<java.util.List<java.net.InetAddress>> resolveAll(java.lang.String inetHost, java.lang.Iterable<DnsRecord> additionals)
inetHost
- the name to resolveadditionals
- additional records (OPT
)public final Future<java.util.List<java.net.InetAddress>> resolveAll(java.lang.String inetHost, java.lang.Iterable<DnsRecord> additionals, Promise<java.util.List<java.net.InetAddress>> promise)
inetHost
- the name to resolveadditionals
- additional records (OPT
)promise
- the Promise
which will be fulfilled when the name resolution is finishedprotected void doResolve(java.lang.String inetHost, Promise<java.net.InetAddress> promise) throws java.lang.Exception
SimpleNameResolver
SimpleNameResolver.resolve(String)
to perform the actual name resolution.doResolve
in class SimpleNameResolver<java.net.InetAddress>
java.lang.Exception
private static DnsRecord[] toArray(java.lang.Iterable<DnsRecord> additionals, boolean validateType)
private static void validateAdditional(DnsRecord record, boolean validateType)
private java.net.InetAddress loopbackAddress()
protected void doResolve(java.lang.String inetHost, DnsRecord[] additionals, Promise<java.net.InetAddress> promise, DnsCache resolveCache) throws java.lang.Exception
java.lang.Exception
private boolean doResolveCached(java.lang.String hostname, DnsRecord[] additionals, Promise<java.net.InetAddress> promise, DnsCache resolveCache)
private static <T> void trySuccess(Promise<T> promise, T result)
private static void tryFailure(Promise<?> promise, java.lang.Throwable cause)
private void doResolveUncached(java.lang.String hostname, DnsRecord[] additionals, Promise<java.net.InetAddress> promise, DnsCache resolveCache)
protected void doResolveAll(java.lang.String inetHost, Promise<java.util.List<java.net.InetAddress>> promise) throws java.lang.Exception
SimpleNameResolver
SimpleNameResolver.resolveAll(String)
to perform the actual name resolution.doResolveAll
in class SimpleNameResolver<java.net.InetAddress>
java.lang.Exception
protected void doResolveAll(java.lang.String inetHost, DnsRecord[] additionals, Promise<java.util.List<java.net.InetAddress>> promise, DnsCache resolveCache) throws java.lang.Exception
java.lang.Exception
private boolean doResolveAllCached(java.lang.String hostname, DnsRecord[] additionals, Promise<java.util.List<java.net.InetAddress>> promise, DnsCache resolveCache)
private void doResolveAllUncached(java.lang.String hostname, DnsRecord[] additionals, Promise<java.util.List<java.net.InetAddress>> promise, DnsCache resolveCache)
private static java.lang.String hostname(java.lang.String inetHost)
public Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> query(DnsQuestion question)
public Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> query(DnsQuestion question, java.lang.Iterable<DnsRecord> additionals)
public Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> query(DnsQuestion question, Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise)
private java.net.InetSocketAddress nextNameServerAddress()
public Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> query(java.net.InetSocketAddress nameServerAddr, DnsQuestion question)
public Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> query(java.net.InetSocketAddress nameServerAddr, DnsQuestion question, java.lang.Iterable<DnsRecord> additionals)
public Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> query(java.net.InetSocketAddress nameServerAddr, DnsQuestion question, Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise)
public Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> query(java.net.InetSocketAddress nameServerAddr, DnsQuestion question, java.lang.Iterable<DnsRecord> additionals, Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise)
final Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> query0(java.net.InetSocketAddress nameServerAddr, DnsQuestion question, DnsRecord[] additionals, Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise)
final Future<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> query0(java.net.InetSocketAddress nameServerAddr, DnsQuestion question, DnsRecord[] additionals, ChannelPromise writePromise, Promise<AddressedEnvelope<? extends DnsResponse,java.net.InetSocketAddress>> promise)
private static Promise<AddressedEnvelope<DnsResponse,java.net.InetSocketAddress>> cast(Promise<?> promise)