disable nagle algorithm for TLS handshake
This commit is contained in:
		| @@ -37,9 +37,13 @@ enum Inner { | ||||
|     #[cfg(not(feature = "tls"))] | ||||
|     Http(HttpConnector), | ||||
|     #[cfg(feature = "default-tls")] | ||||
|     DefaultTls(::hyper_tls::HttpsConnector<HttpConnector>, TlsConnector), | ||||
|     DefaultTls(HttpConnector, TlsConnector), | ||||
|     #[cfg(feature = "rustls-tls")] | ||||
|     RustlsTls(::hyper_rustls::HttpsConnector<HttpConnector>, Arc<rustls::ClientConfig>) | ||||
|     RustlsTls { | ||||
|         http: HttpConnector, | ||||
|         tls: Arc<rustls::ClientConfig>, | ||||
|         tls_proxy: Arc<rustls::ClientConfig> | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl Connector { | ||||
| @@ -71,7 +75,6 @@ impl Connector { | ||||
|         let mut http = http_connector()?; | ||||
|         http.set_local_address(local_addr.into()); | ||||
|         http.enforce_http(false); | ||||
|         let http = ::hyper_tls::HttpsConnector::from((http, tls.clone())); | ||||
|  | ||||
|         Ok(Connector { | ||||
|             inner: Inner::DefaultTls(http, tls), | ||||
| @@ -92,19 +95,18 @@ impl Connector { | ||||
|         http.set_local_address(local_addr.into()); | ||||
|         http.enforce_http(false); | ||||
|  | ||||
|         let inner = if proxies.is_empty() { | ||||
|         let (tls, tls_proxy) = if proxies.is_empty() { | ||||
|             let tls = Arc::new(tls); | ||||
|             let http = ::hyper_rustls::HttpsConnector::from((http, tls.clone())); | ||||
|             Inner::RustlsTls(http, tls) | ||||
|             (tls.clone(), 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)) | ||||
|             (Arc::new(tls), Arc::new(tls_proxy)) | ||||
|         }; | ||||
|  | ||||
|         Ok(Connector { | ||||
|             inner, proxies, | ||||
|             inner: Inner::RustlsTls { http, tls, tls_proxy }, | ||||
|             proxies, | ||||
|             timeout: None, | ||||
|         }) | ||||
|     } | ||||
| @@ -160,9 +162,41 @@ impl Connect for Connector { | ||||
|                     #[cfg(not(feature = "tls"))] | ||||
|                     Inner::Http(http) => connect!(http, $dst, $proxy), | ||||
|                     #[cfg(feature = "default-tls")] | ||||
|                     Inner::DefaultTls(http, _) => connect!(http, $dst, $proxy), | ||||
|                     Inner::DefaultTls(http, tls) => { | ||||
|                         let http = ::hyper_tls::HttpsConnector::from((http.clone(), tls.clone())); | ||||
|                         connect!(http, $dst, $proxy) | ||||
|                     }, | ||||
|                     #[cfg(feature = "rustls-tls")] | ||||
|                     Inner::RustlsTls(http, _) => connect!(http, $dst, $proxy) | ||||
|                     Inner::RustlsTls { http, tls, .. } => { | ||||
|                         use ::rustls::Session; | ||||
|  | ||||
|                         let mut http = http.clone(); | ||||
|  | ||||
|                         // Disable Nagle's algorithm for TLS handshake | ||||
|                         // | ||||
|                         // https://www.openssl.org/docs/man1.1.1/man3/SSL_connect.html#NOTES | ||||
|                         if $dst.scheme() == "https" { | ||||
|                             http.set_nodelay(true); | ||||
|                         } | ||||
|  | ||||
|                         let http = ::hyper_rustls::HttpsConnector::from((http, tls.clone())); | ||||
|  | ||||
|                         timeout!(http.connect($dst) | ||||
|                             .and_then(|(mut io, connected)| { | ||||
|                                 if let ::hyper_rustls::MaybeHttpsStream::Https(stream) = &mut io { | ||||
|                                     let (io, session) = stream.get_mut(); | ||||
|  | ||||
|                                     // keep nodelay for h2 | ||||
|                                     // | ||||
|                                     // https://http2.github.io/faq/#will-i-need-tcp_nodelay-for-my-http2-connections | ||||
|                                     if session.get_alpn_protocol() != Some(b"h2") { | ||||
|                                         io.set_nodelay(false)?; | ||||
|                                     } | ||||
|                                 } | ||||
|  | ||||
|                                 Ok((Box::new(io) as Conn, connected.proxy($proxy))) | ||||
|                             })) | ||||
|                     } | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
| @@ -193,6 +227,7 @@ impl Connect for Connector { | ||||
|  | ||||
|                         let host = dst.host().to_owned(); | ||||
|                         let port = dst.port().unwrap_or(443); | ||||
|                         let http = ::hyper_tls::HttpsConnector::from((http.clone(), tls.clone())); | ||||
|                         let tls = tls.clone(); | ||||
|                         return timeout!(http.connect(ndst).and_then(move |(conn, connected)| { | ||||
|                             trace!("tunneling HTTPS over proxy"); | ||||
| @@ -205,13 +240,14 @@ impl Connect for Connector { | ||||
|                         })); | ||||
|                     }, | ||||
|                     #[cfg(feature = "rustls-tls")] | ||||
|                     Inner::RustlsTls(http, tls) => if dst.scheme() == "https" { | ||||
|                     Inner::RustlsTls { http, tls, tls_proxy } => if dst.scheme() == "https" { | ||||
|                         use rustls::Session; | ||||
|                         use tokio_rustls::TlsConnector as RustlsConnector; | ||||
|                         use tokio_rustls::webpki::DNSNameRef; | ||||
|  | ||||
|                         let host = dst.host().to_owned(); | ||||
|                         let port = dst.port().unwrap_or(443); | ||||
|                         let http = ::hyper_rustls::HttpsConnector::from((http.clone(), tls_proxy.clone())); | ||||
|                         let tls = tls.clone(); | ||||
|                         return timeout!(http.connect(ndst).and_then(move |(conn, connected)| { | ||||
|                             trace!("tunneling HTTPS over proxy"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user