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:
parent
51c4dfe5cb
commit
b9d8a215b4
@ -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
|
||||||
|
@ -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 }
|
||||||
|
@ -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
|
||||||
|
@ -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()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user