@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) |
asAddressResolverresolve, resolve, resolveAll, resolveAllprivate 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
DnsQueryContexts 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 DatagramChannelresolveCache - 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.Closeableclose in interface java.lang.AutoCloseableclose in class SimpleNameResolver<java.net.InetAddress>protected EventLoop executor()
SimpleNameResolverEventExecutor 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
SimpleNameResolverSimpleNameResolver.resolve(String) to perform the actual name resolution.doResolve in class SimpleNameResolver<java.net.InetAddress>java.lang.Exceptionprivate 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.Exceptionprivate 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
SimpleNameResolverSimpleNameResolver.resolveAll(String) to perform the actual name resolution.doResolveAll in class SimpleNameResolver<java.net.InetAddress>java.lang.Exceptionprotected void doResolveAll(java.lang.String inetHost,
DnsRecord[] additionals,
Promise<java.util.List<java.net.InetAddress>> promise,
DnsCache resolveCache)
throws java.lang.Exception
java.lang.Exceptionprivate 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)