1
0
mirror of https://github.com/fafhrd91/actix-net synced 2025-02-24 23:33:21 +01:00

Start trust-dns default resolver on first use

This commit is contained in:
Nikolay Kim 2019-04-11 09:57:21 -07:00
parent 51c4dfe5cb
commit b9d8a215b4
4 changed files with 65 additions and 23 deletions

View File

@ -1,5 +1,11 @@
# Changes # Changes
## [0.1.3] - 2019-04-11
### Changed
* Start trust-dns default resolver on first use
## [0.1.2] - 2019-04-04 ## [0.1.2] - 2019-04-04
### Added ### Added

View File

@ -1,6 +1,6 @@
[package] [package]
name = "actix-connect" name = "actix-connect"
version = "0.1.2" version = "0.1.3"
authors = ["Nikolay Kim <fafhrd91@gmail.com>"] authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
description = "Actix Connector - tcp connector service" description = "Actix Connector - tcp connector service"
keywords = ["network", "framework", "async", "futures"] keywords = ["network", "framework", "async", "futures"]
@ -30,9 +30,9 @@ ssl = ["openssl", "tokio-openssl"]
uri = ["http"] uri = ["http"]
[dependencies] [dependencies]
actix-service = "0.3.4" actix-service = "0.3.6"
actix-codec = "0.1.1" actix-codec = "0.1.2"
actix-utils = "0.3.4" actix-utils = "0.3.5"
derive_more = "0.14.0" derive_more = "0.14.0"
either = "1.5.1" either = "1.5.1"
futures = "0.1.25" futures = "0.1.25"
@ -40,7 +40,7 @@ http = { version = "0.1.16", optional = true }
log = "0.4" log = "0.4"
tokio-tcp = "0.1.3" tokio-tcp = "0.1.3"
tokio-current-thread = "0.1.5" tokio-current-thread = "0.1.5"
trust-dns-resolver = { version="0.11.0-alpha.2", default-features = false } trust-dns-resolver = { version="0.11.0-alpha.3", default-features = false }
# openssl # openssl
openssl = { version="0.10", optional = true } openssl = { version="0.10", optional = true }

View File

@ -8,6 +8,8 @@
#[macro_use] #[macro_use]
extern crate log; extern crate log;
use std::cell::RefCell;
mod connect; mod connect;
mod connector; mod connector;
mod error; mod error;
@ -46,18 +48,34 @@ pub fn start_resolver(cfg: ResolverConfig, opts: ResolverOpts) -> AsyncResolver
resolver resolver
} }
pub fn start_default_resolver() -> AsyncResolver { thread_local! {
let (cfg, opts) = match read_system_conf() { static DEFAULT_RESOLVER: RefCell<Option<AsyncResolver>> = RefCell::new(None);
Ok((cfg, opts)) => (cfg, opts), }
Err(e) => {
log::error!("TRust-DNS can not load system config: {}", e);
(ResolverConfig::default(), ResolverOpts::default())
}
};
let (resolver, bg) = AsyncResolver::new(cfg, opts); pub(crate) fn get_default_resolver() -> AsyncResolver {
tokio_current_thread::spawn(bg); DEFAULT_RESOLVER.with(|cell| {
resolver if let Some(ref resolver) = *cell.borrow() {
return resolver.clone();
}
let (cfg, opts) = match read_system_conf() {
Ok((cfg, opts)) => (cfg, opts),
Err(e) => {
log::error!("TRust-DNS can not load system config: {}", e);
(ResolverConfig::default(), ResolverOpts::default())
}
};
let (resolver, bg) = AsyncResolver::new(cfg, opts);
tokio_current_thread::spawn(bg);
*cell.borrow_mut() = Some(resolver.clone());
resolver
})
}
pub fn start_default_resolver() -> AsyncResolver {
get_default_resolver()
} }
/// Create tcp connector service /// Create tcp connector service

View File

@ -10,10 +10,11 @@ use trust_dns_resolver::{AsyncResolver, Background};
use crate::connect::{Address, Connect}; use crate::connect::{Address, Connect};
use crate::error::ConnectError; use crate::error::ConnectError;
use crate::get_default_resolver;
/// DNS Resolver Service factory /// DNS Resolver Service factory
pub struct ResolverFactory<T> { pub struct ResolverFactory<T> {
resolver: AsyncResolver, resolver: Option<AsyncResolver>,
_t: PhantomData<T>, _t: PhantomData<T>,
} }
@ -21,13 +22,18 @@ impl<T> ResolverFactory<T> {
/// Create new resolver instance with custom configuration and options. /// Create new resolver instance with custom configuration and options.
pub fn new(resolver: AsyncResolver) -> Self { pub fn new(resolver: AsyncResolver) -> Self {
ResolverFactory { ResolverFactory {
resolver, resolver: Some(resolver),
_t: PhantomData, _t: PhantomData,
} }
} }
}
pub fn resolver(&self) -> &AsyncResolver { impl<T> Default for ResolverFactory<T> {
&self.resolver fn default() -> Self {
ResolverFactory {
resolver: None,
_t: PhantomData,
}
} }
} }
@ -58,7 +64,7 @@ impl<T: Address> NewService for ResolverFactory<T> {
/// DNS Resolver Service /// DNS Resolver Service
pub struct Resolver<T> { pub struct Resolver<T> {
resolver: AsyncResolver, resolver: Option<AsyncResolver>,
_t: PhantomData<T>, _t: PhantomData<T>,
} }
@ -66,7 +72,16 @@ impl<T> Resolver<T> {
/// Create new resolver instance with custom configuration and options. /// Create new resolver instance with custom configuration and options.
pub fn new(resolver: AsyncResolver) -> Self { pub fn new(resolver: AsyncResolver) -> Self {
Resolver { Resolver {
resolver, resolver: Some(resolver),
_t: PhantomData,
}
}
}
impl<T> Default for Resolver<T> {
fn default() -> Self {
Resolver {
resolver: None,
_t: PhantomData, _t: PhantomData,
} }
} }
@ -100,7 +115,10 @@ impl<T: Address> Service for Resolver<T> {
Either::B(ok(req)) Either::B(ok(req))
} else { } else {
trace!("DNS resolver: resolving host {:?}", req.host()); trace!("DNS resolver: resolving host {:?}", req.host());
Either::A(ResolverFuture::new(req, &self.resolver)) if self.resolver.is_none() {
self.resolver = Some(get_default_resolver());
}
Either::A(ResolverFuture::new(req, self.resolver.as_ref().unwrap()))
} }
} }
} }