Package org.minidns
Class AbstractDnsClient
- java.lang.Object
-
- org.minidns.AbstractDnsClient
-
- Direct Known Subclasses:
DnsClient
,IterativeDnsClient
,ReliableDnsClient
public abstract class AbstractDnsClient extends Object
A minimal DNS client for SRV/A/AAAA/NS and CNAME lookups, with IDN support. This circumvents the missing javax.naming package on android.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
AbstractDnsClient.IpVersionSetting
-
Field Summary
Fields Modifier and Type Field Description protected DnsCache
cache
The internal DNS cache.protected DnsDataSource
dataSource
protected static LruCache
DEFAULT_CACHE
protected static AbstractDnsClient.IpVersionSetting
DEFAULT_IP_VERSION_SETTING
protected Random
insecureRandom
protected AbstractDnsClient.IpVersionSetting
ipVersionSetting
protected static Logger
LOGGER
protected Random
random
The internal random class for sequence generation.
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractDnsClient()
Create a new DNS client using the global default cache.protected
AbstractDnsClient(DnsCache cache)
Create a new DNS client with the given DNS cache.
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description DnsCache
getCache()
Get the cache used by this DNS client.Set<A>
getCachedIPv4AddressesFor(DnsName dnsName)
Set<A>
getCachedIPv4NameserverAddressesFor(DnsName dnsName)
Set<AAAA>
getCachedIPv6AddressesFor(DnsName dnsName)
Set<AAAA>
getCachedIPv6NameserverAddressesFor(DnsName dnsName)
Set<NS>
getCachedNameserverRecordsFor(DnsName dnsName)
DnsDataSource
getDataSource()
Returns the currently usedDnsDataSource
.AbstractDnsClient.IpVersionSetting
getPreferedIpVersion()
protected DnsMessage
getQueryFor(Question q)
protected boolean
isResponseCacheable(Question q, DnsQueryResult result)
Whether a response from the DNS system should be cached or not.protected abstract DnsMessage.Builder
newQuestion(DnsMessage.Builder questionMessage)
DnsQueryResult
query(CharSequence name, Record.TYPE type)
Query the system nameservers for a single entry of the class IN (which is used for MX, SRV, A, AAAA and most other RRs).DnsQueryResult
query(String name, Record.TYPE type, InetAddress address)
Query a nameserver for a single entry of class IN.DnsQueryResult
query(String name, Record.TYPE type, Record.CLASS clazz)
Query the system nameservers for a single entry of any class.DnsQueryResult
query(String name, Record.TYPE type, Record.CLASS clazz, InetAddress address)
Query a nameserver for a single entry.DnsQueryResult
query(String name, Record.TYPE type, Record.CLASS clazz, InetAddress address, int port)
Query a nameserver for a single entry.protected abstract DnsQueryResult
query(DnsMessage.Builder query)
Send a query request to the DNS system.DnsQueryResult
query(DnsMessage query, InetAddress host)
DnsQueryResult
query(DnsMessage requestMessage, InetAddress address, int port)
DnsQueryResult
query(Question q)
DnsQueryResult
query(Question q, InetAddress address)
Query a specific server for one entry.DnsQueryResult
query(Question q, InetAddress server, int port)
DnsQueryResult
query(DnsName name, Record.TYPE type)
Query the system nameservers for a single entry of the class IN (which is used for MX, SRV, A, AAAA and most other RRs).MiniDnsFuture<DnsQueryResult,IOException>
queryAsync(CharSequence name, Record.TYPE type)
protected MiniDnsFuture<DnsQueryResult,IOException>
queryAsync(DnsMessage.Builder query)
Default implementation of an asynchronous DNS query which just wraps the synchronous case.MiniDnsFuture<DnsQueryResult,IOException>
queryAsync(DnsMessage query, InetAddress dnsServer)
MiniDnsFuture<DnsQueryResult,IOException>
queryAsync(DnsMessage requestMessage, InetAddress address, int port)
MiniDnsFuture<DnsQueryResult,IOException>
queryAsync(Question q)
void
setDataSource(DnsDataSource dataSource)
Set aDnsDataSource
to be used by the DnsClient.static void
setDefaultIpVersion(AbstractDnsClient.IpVersionSetting preferedIpVersion)
void
setPreferedIpVersion(AbstractDnsClient.IpVersionSetting preferedIpVersion)
-
-
-
Field Detail
-
DEFAULT_CACHE
protected static final LruCache DEFAULT_CACHE
-
insecureRandom
protected final Random insecureRandom
-
dataSource
protected DnsDataSource dataSource
-
DEFAULT_IP_VERSION_SETTING
protected static AbstractDnsClient.IpVersionSetting DEFAULT_IP_VERSION_SETTING
-
ipVersionSetting
protected AbstractDnsClient.IpVersionSetting ipVersionSetting
-
-
Constructor Detail
-
AbstractDnsClient
protected AbstractDnsClient(DnsCache cache)
Create a new DNS client with the given DNS cache.- Parameters:
cache
- The backend DNS cache.
-
AbstractDnsClient
protected AbstractDnsClient()
Create a new DNS client using the global default cache.
-
-
Method Detail
-
setDefaultIpVersion
public static void setDefaultIpVersion(AbstractDnsClient.IpVersionSetting preferedIpVersion)
-
setPreferedIpVersion
public void setPreferedIpVersion(AbstractDnsClient.IpVersionSetting preferedIpVersion)
-
getPreferedIpVersion
public AbstractDnsClient.IpVersionSetting getPreferedIpVersion()
-
query
public final DnsQueryResult query(String name, Record.TYPE type, Record.CLASS clazz) throws IOException
Query the system nameservers for a single entry of any class. This can be used to determine the name server version, if name is version.bind, type is TYPE.TXT and clazz is CLASS.CH.- Parameters:
name
- The DNS name to request.type
- The DNS type to request (SRV, A, AAAA, ...).clazz
- The class of the request (usually IN for Internet).- Returns:
- The response (or null on timeout/error).
- Throws:
IOException
- if an IO error occurs.
-
query
public final DnsQueryResult query(DnsName name, Record.TYPE type) throws IOException
Query the system nameservers for a single entry of the class IN (which is used for MX, SRV, A, AAAA and most other RRs).- Parameters:
name
- The DNS name to request.type
- The DNS type to request (SRV, A, AAAA, ...).- Returns:
- The response (or null on timeout/error).
- Throws:
IOException
- if an IO error occurs.
-
query
public final DnsQueryResult query(CharSequence name, Record.TYPE type) throws IOException
Query the system nameservers for a single entry of the class IN (which is used for MX, SRV, A, AAAA and most other RRs).- Parameters:
name
- The DNS name to request.type
- The DNS type to request (SRV, A, AAAA, ...).- Returns:
- The response (or null on timeout/error).
- Throws:
IOException
- if an IO error occurs.
-
query
public DnsQueryResult query(Question q) throws IOException
- Throws:
IOException
-
query
protected abstract DnsQueryResult query(DnsMessage.Builder query) throws IOException
Send a query request to the DNS system.- Parameters:
query
- The query to send to the server.- Returns:
- The response (or null).
- Throws:
IOException
- if an IO error occurs.
-
queryAsync
public final MiniDnsFuture<DnsQueryResult,IOException> queryAsync(CharSequence name, Record.TYPE type)
-
queryAsync
public final MiniDnsFuture<DnsQueryResult,IOException> queryAsync(Question q)
-
queryAsync
protected MiniDnsFuture<DnsQueryResult,IOException> queryAsync(DnsMessage.Builder query)
Default implementation of an asynchronous DNS query which just wraps the synchronous case.Subclasses override this method to support true asynchronous queries.
- Parameters:
query
- the query.- Returns:
- a future for this query.
-
query
public final DnsQueryResult query(Question q, InetAddress server, int port) throws IOException
- Throws:
IOException
-
query
public final DnsQueryResult query(DnsMessage requestMessage, InetAddress address, int port) throws IOException
- Throws:
IOException
-
queryAsync
public final MiniDnsFuture<DnsQueryResult,IOException> queryAsync(DnsMessage requestMessage, InetAddress address, int port)
-
isResponseCacheable
protected boolean isResponseCacheable(Question q, DnsQueryResult result)
Whether a response from the DNS system should be cached or not.- Parameters:
q
- The question the response message should answer.result
- The DNS query result.- Returns:
- True, if the response should be cached, false otherwise.
-
newQuestion
protected abstract DnsMessage.Builder newQuestion(DnsMessage.Builder questionMessage)
-
query
public DnsQueryResult query(String name, Record.TYPE type, Record.CLASS clazz, InetAddress address, int port) throws IOException
Query a nameserver for a single entry.- Parameters:
name
- The DNS name to request.type
- The DNS type to request (SRV, A, AAAA, ...).clazz
- The class of the request (usually IN for Internet).address
- The DNS server address.port
- The DNS server port.- Returns:
- The response (or null on timeout / failure).
- Throws:
IOException
- On IO Errors.
-
query
public DnsQueryResult query(String name, Record.TYPE type, Record.CLASS clazz, InetAddress address) throws IOException
Query a nameserver for a single entry.- Parameters:
name
- The DNS name to request.type
- The DNS type to request (SRV, A, AAAA, ...).clazz
- The class of the request (usually IN for Internet).address
- The DNS server host.- Returns:
- The response (or null on timeout / failure).
- Throws:
IOException
- On IO Errors.
-
query
public DnsQueryResult query(String name, Record.TYPE type, InetAddress address) throws IOException
Query a nameserver for a single entry of class IN.- Parameters:
name
- The DNS name to request.type
- The DNS type to request (SRV, A, AAAA, ...).address
- The DNS server host.- Returns:
- The response (or null on timeout / failure).
- Throws:
IOException
- On IO Errors.
-
query
public final DnsQueryResult query(DnsMessage query, InetAddress host) throws IOException
- Throws:
IOException
-
query
public DnsQueryResult query(Question q, InetAddress address) throws IOException
Query a specific server for one entry.- Parameters:
q
- The question section of the DNS query.address
- The dns server address.- Returns:
- The a DNS query result.
- Throws:
IOException
- On IOErrors.
-
queryAsync
public final MiniDnsFuture<DnsQueryResult,IOException> queryAsync(DnsMessage query, InetAddress dnsServer)
-
getDataSource
public DnsDataSource getDataSource()
Returns the currently usedDnsDataSource
. SeesetDataSource(DnsDataSource)
for details.- Returns:
- The currently used
DnsDataSource
-
setDataSource
public void setDataSource(DnsDataSource dataSource)
Set aDnsDataSource
to be used by the DnsClient. The default implementation will direct all queries directly to the Internet. This can be used to define a non-default handling for outgoing data. This can be useful to redirect the requests to a proxy or to modify requests after or responses before they are handled by the DnsClient implementation.- Parameters:
dataSource
- An implementation of DNSDataSource that shall be used.
-
getCache
public DnsCache getCache()
Get the cache used by this DNS client.- Returns:
- the cached used by this DNS client or
null
.
-
getQueryFor
protected DnsMessage getQueryFor(Question q)
-
getCachedNameserverRecordsFor
public Set<NS> getCachedNameserverRecordsFor(DnsName dnsName)
-
getCachedIPv4AddressesFor
public Set<A> getCachedIPv4AddressesFor(DnsName dnsName)
-
getCachedIPv6AddressesFor
public Set<AAAA> getCachedIPv6AddressesFor(DnsName dnsName)
-
getCachedIPv4NameserverAddressesFor
public Set<A> getCachedIPv4NameserverAddressesFor(DnsName dnsName)
-
getCachedIPv6NameserverAddressesFor
public Set<AAAA> getCachedIPv6NameserverAddressesFor(DnsName dnsName)
-
-