fix proxy missing alpn (#466)

* fix #459

* disable alpn for proxy connection
This commit is contained in:
quininer
2019-03-07 03:02:55 +08:00
committed by Sean McArthur
parent d7475d61f2
commit a27db28deb

View File

@@ -91,11 +91,20 @@ impl Connector {
let mut http = http_connector()?; let mut http = http_connector()?;
http.set_local_address(local_addr.into()); http.set_local_address(local_addr.into());
http.enforce_http(false); http.enforce_http(false);
let http = ::hyper_rustls::HttpsConnector::from((http, tls.clone()));
let inner = if proxies.is_empty() {
let tls = Arc::new(tls);
let http = ::hyper_rustls::HttpsConnector::from((http, tls.clone()));
Inner::RustlsTls(http, tls)
} else {
let mut tls_proxy = tls.clone();
tls_proxy.alpn_protocols.clear();
let http = ::hyper_rustls::HttpsConnector::from((http, tls_proxy));
Inner::RustlsTls(http, Arc::new(tls))
};
Ok(Connector { Ok(Connector {
inner: Inner::RustlsTls(http, Arc::new(tls)), inner, proxies,
proxies,
timeout: None, timeout: None,
}) })
} }
@@ -180,7 +189,6 @@ impl Connect for Connector {
match &self.inner { match &self.inner {
#[cfg(feature = "default-tls")] #[cfg(feature = "default-tls")]
Inner::DefaultTls(http, tls) => if dst.scheme() == "https" { Inner::DefaultTls(http, tls) => if dst.scheme() == "https" {
#[cfg(feature = "default-tls")]
use self::native_tls_async::TlsConnectorExt; use self::native_tls_async::TlsConnectorExt;
let host = dst.host().to_owned(); let host = dst.host().to_owned();
@@ -198,9 +206,8 @@ impl Connect for Connector {
}, },
#[cfg(feature = "rustls-tls")] #[cfg(feature = "rustls-tls")]
Inner::RustlsTls(http, tls) => if dst.scheme() == "https" { Inner::RustlsTls(http, tls) => if dst.scheme() == "https" {
#[cfg(feature = "rustls-tls")] use rustls::Session;
use tokio_rustls::TlsConnector as RustlsConnector; use tokio_rustls::TlsConnector as RustlsConnector;
#[cfg(feature = "rustls-tls")]
use tokio_rustls::webpki::DNSNameRef; use tokio_rustls::webpki::DNSNameRef;
let host = dst.host().to_owned(); let host = dst.host().to_owned();
@@ -217,7 +224,14 @@ impl Connect for Connector {
RustlsConnector::from(tls).connect(dnsname.as_ref(), tunneled) RustlsConnector::from(tls).connect(dnsname.as_ref(), tunneled)
.map_err(|e| io::Error::new(io::ErrorKind::Other, e)) .map_err(|e| io::Error::new(io::ErrorKind::Other, e))
}) })
.map(|io| (Box::new(io) as Conn, connected.proxy(true))) .map(|io| {
let connected = if io.get_ref().1.get_alpn_protocol() == Some(b"h2") {
connected.negotiated_h2()
} else {
connected
};
(Box::new(io) as Conn, connected.proxy(true))
})
})); }));
}, },
#[cfg(not(feature = "tls"))] #[cfg(not(feature = "tls"))]