From 59f433fd218f5b3d1fd4d7b790f0b3754abc4217 Mon Sep 17 00:00:00 2001 From: Astro Date: Thu, 17 Jan 2019 01:24:26 +0100 Subject: [PATCH] happy_eyeballs: migrate to newer trust-dns dependencies --- Cargo.toml | 4 ++-- src/error.rs | 10 +++++++- src/happy_eyeballs.rs | 56 ++++++++++++++++++------------------------- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c397ed40be7620798b5c561757d37cd9dce2bf37..954a6052809a3233418dcad48bdc8b48155b8159 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,8 +21,8 @@ xml5ever = "0.12" native-tls = "0.2" tokio-tls = "0.2" sasl = "0.4" -trust-dns-resolver = "0.9.1" -trust-dns-proto = "0.4.0" +trust-dns-resolver = "0.10" +trust-dns-proto = "0.6" xmpp-parsers = "0.12.2" idna = "0.1" quick-xml = "0.13" diff --git a/src/error.rs b/src/error.rs index 9697f2681b860b1416cc16da6e60cd29e436a5f3..8ffa1b7a83c3de5204e9546544cf1df6699fad14 100644 --- a/src/error.rs +++ b/src/error.rs @@ -107,7 +107,7 @@ pub enum AuthError { } /// Error establishing connection -#[derive(Debug, Error)] +#[derive(Debug)] pub enum ConnecterError { /// All attempts failed, no error available AllFailed, @@ -116,3 +116,11 @@ pub enum ConnecterError { /// DNS resolution error Resolve(ResolveError), } + +impl std::error::Error for ConnecterError {} + +impl std::fmt::Display for ConnecterError { + fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + write!(fmt, "{:?}", self) + } +} diff --git a/src/happy_eyeballs.rs b/src/happy_eyeballs.rs index 19dbe4939d4e7e51d84fa8843646ddd10cef5eac..3fa6169ca8d29681964c788ac7b6954eb8f3cb8a 100644 --- a/src/happy_eyeballs.rs +++ b/src/happy_eyeballs.rs @@ -8,17 +8,16 @@ use std::mem; use std::net::SocketAddr; use tokio::net::tcp::ConnectFuture; use tokio::net::TcpStream; -use trust_dns_resolver::config::LookupIpStrategy; +use trust_dns_resolver::{AsyncResolver, Name, IntoName, Background, BackgroundLookup}; use trust_dns_resolver::lookup::SrvLookupFuture; use trust_dns_resolver::lookup_ip::LookupIpFuture; -use trust_dns_resolver::system_conf; -use trust_dns_resolver::{error::ResolveError, IntoName, Name, ResolverFuture}; + enum State { - AwaitResolver(Box + Send>), - ResolveSrv(ResolverFuture, SrvLookupFuture), - ResolveTarget(ResolverFuture, LookupIpFuture, u16), - Connecting(Option, Vec>), + Start(AsyncResolver), + ResolveSrv(AsyncResolver, BackgroundLookup), + ResolveTarget(AsyncResolver, Background, u16), + Connecting(Option, Vec>), Invalid, } @@ -31,11 +30,10 @@ pub struct Connecter { error: Option, } -fn resolver_future( -) -> Result + Send>, IoError> { - let (conf, mut opts) = system_conf::read_system_conf()?; - opts.ip_strategy = LookupIpStrategy::Ipv4AndIpv6; - Ok(ResolverFuture::new(conf, opts)) +fn resolver() -> Result { + let (resolver, resolver_background) = AsyncResolver::from_system_conf()?; + tokio::runtime::current_thread::spawn(resolver_background); + Ok(resolver) } impl Connecter { @@ -57,7 +55,7 @@ impl Connecter { }); } - let state = State::AwaitResolver(resolver_future()?); + let state = State::Start(resolver()?); let srv_domain = match srv { Some(srv) => Some( format!("{}.{}.", srv, domain) @@ -85,29 +83,21 @@ impl Future for Connecter { fn poll(&mut self) -> Poll { let state = mem::replace(&mut self.state, State::Invalid); match state { - State::AwaitResolver(mut resolver_future) => { - match resolver_future.poll().map_err(ConnecterError::Resolve)? { - Async::NotReady => { - self.state = State::AwaitResolver(resolver_future); - Ok(Async::NotReady) + State::Start(resolver) => { + match &self.srv_domain { + &Some(ref srv_domain) => { + let srv_lookup = resolver.lookup_srv(srv_domain); + self.state = State::ResolveSrv(resolver, srv_lookup); } - Async::Ready(resolver) => { - match &self.srv_domain { - &Some(ref srv_domain) => { - let srv_lookup = resolver.lookup_srv(srv_domain); - self.state = State::ResolveSrv(resolver, srv_lookup); - } - None => { - self.targets = [(self.domain.clone(), self.fallback_port)] - .into_iter() - .cloned() - .collect(); - self.state = State::Connecting(Some(resolver), vec![]); - } - } - self.poll() + None => { + self.targets = [(self.domain.clone(), self.fallback_port)] + .into_iter() + .cloned() + .collect(); + self.state = State::Connecting(Some(resolver), vec![]); } } + self.poll() } State::ResolveSrv(resolver, mut srv_lookup) => { match srv_lookup.poll() {