fix(client): never call connect if idle connection is available

The HttpConnector's connect future was lazy, but if any custom connector
did not use a lazy future, then a connect would always be started, even
if an idle connection was available.
This commit is contained in:
Sean McArthur
2018-02-28 14:18:34 -08:00
parent ad7763072c
commit 13741f5145
2 changed files with 105 additions and 27 deletions

View File

@@ -182,22 +182,25 @@ where C: Connect,
let pool = self.pool.clone();
let pool_key = Rc::new(domain.to_string());
let h1_writev = self.h1_writev;
self.connector.connect(url)
.and_then(move |io| {
let (tx, rx) = dispatch::channel();
let tx = HyperClient {
tx: tx,
should_close: Cell::new(true),
};
let pooled = pool.pooled(pool_key, tx);
let mut conn = proto::Conn::<_, _, proto::ClientTransaction, _>::new(io, pooled.clone());
if !h1_writev {
conn.set_write_strategy_flatten();
}
let dispatch = proto::dispatch::Dispatcher::new(proto::dispatch::Client::new(rx), conn);
executor.execute(dispatch.map_err(|e| debug!("client connection error: {}", e)))?;
Ok(pooled)
})
let connector = self.connector.clone();
future::lazy(move || {
connector.connect(url)
.and_then(move |io| {
let (tx, rx) = dispatch::channel();
let tx = HyperClient {
tx: tx,
should_close: Cell::new(true),
};
let pooled = pool.pooled(pool_key, tx);
let mut conn = proto::Conn::<_, _, proto::ClientTransaction, _>::new(io, pooled.clone());
if !h1_writev {
conn.set_write_strategy_flatten();
}
let dispatch = proto::dispatch::Dispatcher::new(proto::dispatch::Client::new(rx), conn);
executor.execute(dispatch.map_err(|e| debug!("client connection error: {}", e)))?;
Ok(pooled)
})
})
};
let race = checkout.select(connect)