Skip to content

Commit b1785c6

Browse files
srijsseanmonstar
authored andcommitted
feat(client): skip dns resolution when host is a valid ip addr (#1372)
1 parent e330d30 commit b1785c6

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

src/client/connect.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,18 @@ impl Future for HttpConnecting {
186186
let state;
187187
match self.state {
188188
State::Lazy(ref executor, ref mut host, port) => {
189-
let host = mem::replace(host, String::new());
190-
let work = dns::Work::new(host, port);
191-
state = State::Resolving(oneshot::spawn(work, executor));
189+
// If the host is already an IP addr (v4 or v6),
190+
// skip resolving the dns and start connecting right away.
191+
if let Some(addrs) = dns::IpAddrs::try_parse(host, port) {
192+
state = State::Connecting(ConnectingTcp {
193+
addrs: addrs,
194+
current: None
195+
})
196+
} else {
197+
let host = mem::replace(host, String::new());
198+
let work = dns::Work::new(host, port);
199+
state = State::Resolving(oneshot::spawn(work, executor));
200+
}
192201
},
193202
State::Resolving(ref mut future) => {
194203
match try!(future.poll()) {

src/client/dns.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
use std::io;
2-
use std::net::{SocketAddr, ToSocketAddrs};
2+
use std::net::{
3+
Ipv4Addr, Ipv6Addr,
4+
SocketAddr, ToSocketAddrs,
5+
SocketAddrV4, SocketAddrV6,
6+
};
37
use std::vec;
48

59
use ::futures::{Async, Future, Poll};
@@ -30,6 +34,20 @@ pub struct IpAddrs {
3034
iter: vec::IntoIter<SocketAddr>,
3135
}
3236

37+
impl IpAddrs {
38+
pub fn try_parse(host: &str, port: u16) -> Option<IpAddrs> {
39+
if let Ok(addr) = host.parse::<Ipv4Addr>() {
40+
let addr = SocketAddrV4::new(addr, port);
41+
return Some(IpAddrs { iter: vec![SocketAddr::V4(addr)].into_iter() })
42+
}
43+
if let Ok(addr) = host.parse::<Ipv6Addr>() {
44+
let addr = SocketAddrV6::new(addr, port, 0, 0);
45+
return Some(IpAddrs { iter: vec![SocketAddr::V6(addr)].into_iter() })
46+
}
47+
None
48+
}
49+
}
50+
3351
impl Iterator for IpAddrs {
3452
type Item = SocketAddr;
3553
#[inline]

0 commit comments

Comments
 (0)