feat(client): skip dns resolution when host is a valid ip addr (#1372)

This commit is contained in:
Sam Rijs
2017-11-14 10:00:34 +11:00
committed by Sean McArthur
parent e330d30964
commit b1785c662b
2 changed files with 31 additions and 4 deletions

View File

@@ -186,9 +186,18 @@ impl Future for HttpConnecting {
let state; let state;
match self.state { match self.state {
State::Lazy(ref executor, ref mut host, port) => { State::Lazy(ref executor, ref mut host, port) => {
// If the host is already an IP addr (v4 or v6),
// skip resolving the dns and start connecting right away.
if let Some(addrs) = dns::IpAddrs::try_parse(host, port) {
state = State::Connecting(ConnectingTcp {
addrs: addrs,
current: None
})
} else {
let host = mem::replace(host, String::new()); let host = mem::replace(host, String::new());
let work = dns::Work::new(host, port); let work = dns::Work::new(host, port);
state = State::Resolving(oneshot::spawn(work, executor)); state = State::Resolving(oneshot::spawn(work, executor));
}
}, },
State::Resolving(ref mut future) => { State::Resolving(ref mut future) => {
match try!(future.poll()) { match try!(future.poll()) {

View File

@@ -1,5 +1,9 @@
use std::io; use std::io;
use std::net::{SocketAddr, ToSocketAddrs}; use std::net::{
Ipv4Addr, Ipv6Addr,
SocketAddr, ToSocketAddrs,
SocketAddrV4, SocketAddrV6,
};
use std::vec; use std::vec;
use ::futures::{Async, Future, Poll}; use ::futures::{Async, Future, Poll};
@@ -30,6 +34,20 @@ pub struct IpAddrs {
iter: vec::IntoIter<SocketAddr>, iter: vec::IntoIter<SocketAddr>,
} }
impl IpAddrs {
pub fn try_parse(host: &str, port: u16) -> Option<IpAddrs> {
if let Ok(addr) = host.parse::<Ipv4Addr>() {
let addr = SocketAddrV4::new(addr, port);
return Some(IpAddrs { iter: vec![SocketAddr::V4(addr)].into_iter() })
}
if let Ok(addr) = host.parse::<Ipv6Addr>() {
let addr = SocketAddrV6::new(addr, port, 0, 0);
return Some(IpAddrs { iter: vec![SocketAddr::V6(addr)].into_iter() })
}
None
}
}
impl Iterator for IpAddrs { impl Iterator for IpAddrs {
type Item = SocketAddr; type Item = SocketAddr;
#[inline] #[inline]