refactor(client): make HttpConnector lazy

This commit is contained in:
Sean McArthur
2017-05-08 11:51:20 -07:00
parent e6b588b81d
commit 6655134583

View File

@@ -1,6 +1,7 @@
use std::error::Error as StdError; use std::error::Error as StdError;
use std::fmt; use std::fmt;
use std::io; use std::io;
use std::mem;
//use std::net::SocketAddr; //use std::net::SocketAddr;
use futures::{Future, Poll, Async}; use futures::{Future, Poll, Async};
@@ -109,7 +110,7 @@ impl Service for HttpConnector {
}; };
HttpConnecting { HttpConnecting {
state: State::Resolving(self.dns.resolve(host.into(), port)), state: State::Lazy(self.dns.clone(), host.into(), port),
handle: self.handle.clone(), handle: self.handle.clone(),
} }
} }
@@ -153,6 +154,7 @@ pub struct HttpConnecting {
} }
enum State { enum State {
Lazy(dns::Dns, String, u16),
Resolving(dns::Query), Resolving(dns::Query),
Connecting(ConnectingTcp), Connecting(ConnectingTcp),
Error(Option<io::Error>), Error(Option<io::Error>),
@@ -166,6 +168,10 @@ impl Future for HttpConnecting {
loop { loop {
let state; let state;
match self.state { match self.state {
State::Lazy(ref dns, ref mut host, port) => {
let host = mem::replace(host, String::new());
state = State::Resolving(dns.resolve(host, port));
},
State::Resolving(ref mut query) => { State::Resolving(ref mut query) => {
match try!(query.poll()) { match try!(query.poll()) {
Async::NotReady => return Ok(Async::NotReady), Async::NotReady => return Ok(Async::NotReady),