[trust-dns-resolver] Abstract resolver

1. Create a trait RuntimeProvider to abstract the resolver
implementation.
2. Make TokioAsyncResolver as default type.
3. Keep the tls related codes unchanged, which may be abstracted at a
later point.
4. Update the other codes and test cases wherever necessary.
This commit is contained in:
Chunying Wang
2019-12-27 20:49:10 -05:00
committed by Benjamin Fry
parent c9434bf85b
commit e2abc67abf
13 changed files with 202 additions and 112 deletions

View File

@@ -16,10 +16,9 @@ use proto::error::ProtoResult;
use proto::op::Query;
use proto::rr::domain::TryParseIp;
use proto::rr::{IntoName, Name, Record, RecordType};
use proto::tcp::Connect;
use proto::xfer::{DnsRequestOptions, RetryDnsHandle};
use proto::DnsHandle;
#[cfg(feature = "tokio-runtime")]
use tokio::runtime::Handle;
use crate::config::{ResolverConfig, ResolverOpts};
use crate::dns_lru::{self, DnsLru};
@@ -27,7 +26,10 @@ use crate::error::*;
use crate::lookup::{self, Lookup, LookupEither, LookupFuture};
use crate::lookup_ip::{LookupIp, LookupIpFuture};
use crate::lookup_state::CachingClient;
use crate::name_server::{ConnectionProvider, NameServerPool};
use crate::name_server::{
ConnectionProvider, GenericConnection, GenericConnectionProvider, NameServerPool,
RuntimeProvider,
};
#[cfg(feature = "tokio-runtime")]
use crate::name_server::{TokioConnection, TokioConnectionProvider};
use crate::Hosts;
@@ -104,8 +106,10 @@ pub async fn $p(&self, query: $t) -> Result<$l, ResolveError> {
};
}
#[cfg(feature = "tokio-runtime")]
impl AsyncResolver<TokioConnection, TokioConnectionProvider> {
impl<R: RuntimeProvider> AsyncResolver<GenericConnection, GenericConnectionProvider<R>>
where
<<R as RuntimeProvider>::Tcp as Connect>::Transport: Unpin,
{
/// Construct a new `AsyncResolver` with the provided configuration.
///
/// # Arguments
@@ -122,12 +126,12 @@ impl AsyncResolver<TokioConnection, TokioConnectionProvider> {
pub async fn new(
config: ResolverConfig,
options: ResolverOpts,
runtime: Handle,
runtime: R::Handle,
) -> Result<Self, ResolveError> {
AsyncResolver::<TokioConnection, TokioConnectionProvider>::new_with_conn(
AsyncResolver::<GenericConnection, GenericConnectionProvider<R>>::new_with_conn(
config,
options,
TokioConnectionProvider::new(runtime),
GenericConnectionProvider::<R>::new(runtime),
)
.await
}
@@ -136,8 +140,8 @@ impl AsyncResolver<TokioConnection, TokioConnectionProvider> {
///
/// This will use `/etc/resolv.conf` on Unix OSes and the registry on Windows.
#[cfg(any(unix, target_os = "windows"))]
pub async fn from_system_conf(runtime: Handle) -> Result<Self, ResolveError> {
Self::from_system_conf_with_provider(TokioConnectionProvider::new(runtime)).await
pub async fn from_system_conf(runtime: R::Handle) -> Result<Self, ResolveError> {
Self::from_system_conf_with_provider(GenericConnectionProvider::<R>::new(runtime)).await
}
}
@@ -431,7 +435,7 @@ mod tests {
#[test]
fn test_send_sync() {
assert!(is_send_t::<ResolverConfig>());
assert!(is_send_t::<ResolverConfig>());
assert!(is_sync_t::<ResolverConfig>());
assert!(is_send_t::<ResolverOpts>());
assert!(is_sync_t::<ResolverOpts>());
@@ -456,7 +460,7 @@ mod tests {
let mut io_loop = Runtime::new().unwrap();
let resolver =
AsyncResolver::new(config, ResolverOpts::default(), io_loop.handle().clone());
TokioAsyncResolver::new(config, ResolverOpts::default(), io_loop.handle().clone());
let resolver = io_loop
.block_on(resolver)
.expect("failed to create resolver");
@@ -500,7 +504,7 @@ mod tests {
//env_logger::try_init().ok();
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::default(),
ResolverOpts::default(),
io_loop.handle().clone(),
@@ -537,7 +541,7 @@ mod tests {
// AsyncResolver works correctly.
use std::thread;
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::default(),
ResolverOpts::default(),
io_loop.handle().clone(),
@@ -589,7 +593,7 @@ mod tests {
#[ignore] // these appear to not work on CI
fn test_sec_lookup() {
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::default(),
ResolverOpts {
validate: true,
@@ -626,7 +630,7 @@ mod tests {
#[allow(deprecated)]
fn test_sec_lookup_fails() {
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::default(),
ResolverOpts {
validate: true,
@@ -665,7 +669,7 @@ mod tests {
#[cfg(any(unix, target_os = "windows"))]
fn test_system_lookup() {
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::from_system_conf(io_loop.handle().clone());
let resolver = TokioAsyncResolver::from_system_conf(io_loop.handle().clone());
let resolver = io_loop
.block_on(resolver)
.expect("failed to create resolver");
@@ -695,7 +699,7 @@ mod tests {
#[cfg(unix)]
fn test_hosts_lookup() {
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::from_system_conf(io_loop.handle().clone());
let resolver = TokioAsyncResolver::from_system_conf(io_loop.handle().clone());
let resolver = io_loop
.block_on(resolver)
.expect("failed to create resolver");
@@ -725,7 +729,7 @@ mod tests {
ResolverConfig::default().name_servers().to_owned();
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::from_parts(Some(domain), search, name_servers),
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4Only,
@@ -762,7 +766,7 @@ mod tests {
ResolverConfig::default().name_servers().to_owned();
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::from_parts(Some(domain), search, name_servers),
ResolverOpts {
// our name does have 2, the default should be fine, let's just narrow the test criteria a bit.
@@ -802,7 +806,7 @@ mod tests {
ResolverConfig::default().name_servers().to_owned();
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::from_parts(Some(domain), search, name_servers),
ResolverOpts {
// matches kubernetes default
@@ -845,7 +849,7 @@ mod tests {
ResolverConfig::default().name_servers().to_owned();
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::from_parts(Some(domain), search, name_servers),
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4Only,
@@ -887,7 +891,7 @@ mod tests {
ResolverConfig::default().name_servers().to_owned();
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::from_parts(Some(domain), search, name_servers),
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4Only,
@@ -917,7 +921,7 @@ mod tests {
#[test]
fn test_idna() {
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::default(),
ResolverOpts::default(),
io_loop.handle().clone(),
@@ -938,7 +942,7 @@ mod tests {
#[test]
fn test_localhost_ipv4() {
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::default(),
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4thenIpv6,
@@ -964,7 +968,7 @@ mod tests {
#[test]
fn test_localhost_ipv6() {
let mut io_loop = Runtime::new().unwrap();
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
ResolverConfig::default(),
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv6thenIpv4,
@@ -993,7 +997,7 @@ mod tests {
let mut config = ResolverConfig::default();
config.add_search(Name::from_str("example.com").unwrap());
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
config,
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4Only,
@@ -1023,7 +1027,7 @@ mod tests {
let mut config = ResolverConfig::default();
config.add_search(Name::from_str("example.com").unwrap());
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
config,
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4Only,
@@ -1053,7 +1057,7 @@ mod tests {
let mut config = ResolverConfig::default();
config.add_search(Name::from_str("example.com").unwrap());
let resolver = AsyncResolver::new(
let resolver = TokioAsyncResolver::new(
config,
ResolverOpts {
ip_strategy: LookupIpStrategy::Ipv4Only,