Merge pull request #232 from tafia/hyper-proxy

Remove proxy handling in favor of hyper-proxy crate
This commit is contained in:
Sean McArthur
2018-01-02 10:12:44 -08:00
committed by GitHub
8 changed files with 65 additions and 515 deletions

View File

@@ -1,12 +1,15 @@
use std::fmt;
use std::{io, fmt};
use std::sync::Arc;
use std::time::Duration;
use bytes::Bytes;
use futures::{Async, Future, Poll};
use hyper::client::FutureResponse;
use hyper::client::{Connect, FutureResponse, HttpConnector};
use hyper::header::{Headers, Location, Referer, UserAgent, Accept, Encoding,
AcceptEncoding, Range, qitem};
use hyper_proxy::ProxyConnector;
use hyper_proxy::Proxy as HyperProxy;
use hyper_tls::HttpsConnector;
use native_tls::{TlsConnector, TlsConnectorBuilder};
use tokio_core::reactor::Handle;
@@ -14,7 +17,6 @@ use tokio_core::reactor::Handle;
use super::body;
use super::request::{self, Request, RequestBuilder};
use super::response::{self, Response};
use connect::Connector;
use into_url::to_uri;
use redirect::{self, RedirectPolicy, check_redirect, remove_sensitive_headers};
use {Certificate, Identity, IntoUrl, Method, proxy, Proxy, StatusCode, Url};
@@ -122,26 +124,31 @@ impl ClientBuilder {
.take()
.expect("ClientBuilder cannot be reused after building a Client");
let tls = try_!(config.tls.build());
let proxies = Arc::new(config.proxies);
let mut connector = Connector::new(config.dns_threads, tls, proxies.clone(), handle);
let mut https_connector = try_!(HttpsConnector::new(config.dns_threads, handle));
if !config.hostname_verification {
connector.danger_disable_hostname_verification();
https_connector.danger_disable_hostname_verification(true);
}
let mut connector = ProxyConnector::unsecured(https_connector);
let tls = try_!(config.tls.build());
connector.set_tls(Some(tls));
connector.extend_proxies(config.proxies.iter().map(|p| p.inner.clone()));
let hyper_client = ::hyper::Client::configure()
.connector(connector)
.no_proto()
.build(handle);
// save proxies for http request
let mut proxy = ProxyConnector::unsecured(());
proxy.extend_proxies(config.proxies.into_iter().map(|p| p.inner));
Ok(Client {
inner: Arc::new(ClientRef {
gzip: config.gzip,
hyper: hyper_client,
proxy: proxy,
headers: config.headers,
proxies: proxies,
redirect_policy: config.redirect_policy,
referer: config.referer,
}),
@@ -277,7 +284,7 @@ fn config_mut<'a>(config: &'a mut Option<Config>, err: &Option<::Error>) -> Opti
}
}
type HyperClient = ::hyper::Client<Connector>;
type HyperClient = ::hyper::Client<::hyper_proxy::ProxyConnector<HttpsConnector<HttpConnector>>>;
impl Client {
/// Constructs a new `Client`.
@@ -413,12 +420,10 @@ impl Client {
reusable
});
if proxy::is_proxied(&self.inner.proxies, &url) {
if uri.scheme() == Some("http") {
req.set_proxy(true);
}
if let Some(headers) = self.inner.proxy.http_headers(&uri) {
req.set_proxy(true);
req.headers_mut().extend(headers.iter());
}
let in_flight = self.inner.hyper.request(req);
Pending {
@@ -458,8 +463,8 @@ impl fmt::Debug for ClientBuilder {
struct ClientRef {
gzip: bool,
headers: Headers,
proxy: ProxyConnector<()>,
hyper: HyperClient,
proxies: Arc<Vec<Proxy>>,
redirect_policy: RedirectPolicy,
referer: bool,
}
@@ -557,10 +562,9 @@ impl Future for PendingRequest {
if let Some(Some(ref body)) = self.body {
req.set_body(body.clone());
}
if proxy::is_proxied(&self.client.proxies, &self.url) {
if uri.scheme() == Some("http") {
req.set_proxy(true);
}
if let Some(headers) = self.client.proxy.http_headers(&uri) {
req.set_proxy(true);
req.headers_mut().extend(headers.iter());
}
self.in_flight = self.client.hyper.request(req);
continue;