feat(client): skip dns resolution when host is a valid ip addr (#1372)
This commit is contained in:
		| @@ -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()) { | ||||||
|   | |||||||
| @@ -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] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user