| @@ -4,10 +4,24 @@ use std::time::Duration; | ||||
|  | ||||
| use bytes::Bytes; | ||||
| use futures::{Async, Future, Poll}; | ||||
| use header::{ | ||||
|     HeaderMap, | ||||
|     HeaderValue, | ||||
|     ACCEPT, | ||||
|     ACCEPT_ENCODING, | ||||
|     CONTENT_LENGTH, | ||||
|     CONTENT_ENCODING, | ||||
|     CONTENT_TYPE, | ||||
|     LOCATION, | ||||
|     PROXY_AUTHORIZATION, | ||||
|     RANGE, | ||||
|     REFERER, | ||||
|     TRANSFER_ENCODING, | ||||
|     USER_AGENT, | ||||
| }; | ||||
| use http::Uri; | ||||
| use hyper::client::ResponseFuture; | ||||
| use header::{HeaderMap, HeaderValue, LOCATION, USER_AGENT, REFERER, ACCEPT, | ||||
|              ACCEPT_ENCODING, RANGE, TRANSFER_ENCODING, CONTENT_TYPE, CONTENT_LENGTH, CONTENT_ENCODING}; | ||||
| use mime::{self}; | ||||
| use mime; | ||||
| #[cfg(feature = "default-tls")] | ||||
| use native_tls::TlsConnector; | ||||
|  | ||||
| @@ -197,6 +211,10 @@ impl ClientBuilder { | ||||
|         let hyper_client = ::hyper::Client::builder() | ||||
|             .build(connector); | ||||
|  | ||||
|         let proxies_maybe_http_auth = proxies | ||||
|             .iter() | ||||
|             .any(|p| p.maybe_has_http_auth()); | ||||
|  | ||||
|         Ok(Client { | ||||
|             inner: Arc::new(ClientRef { | ||||
|                 gzip: config.gzip, | ||||
| @@ -204,6 +222,8 @@ impl ClientBuilder { | ||||
|                 headers: config.headers, | ||||
|                 redirect_policy: config.redirect_policy, | ||||
|                 referer: config.referer, | ||||
|                 proxies, | ||||
|                 proxies_maybe_http_auth, | ||||
|             }), | ||||
|         }) | ||||
|     } | ||||
| @@ -470,6 +490,8 @@ impl Client { | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         self.proxy_auth(&uri, &mut headers); | ||||
|  | ||||
|         let mut req = ::hyper::Request::builder() | ||||
|             .method(method.clone()) | ||||
|             .uri(uri.clone()) | ||||
| @@ -495,6 +517,40 @@ impl Client { | ||||
|             }), | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn proxy_auth(&self, dst: &Uri, headers: &mut HeaderMap) { | ||||
|         if !self.inner.proxies_maybe_http_auth { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // Only set the header here if the destination scheme is 'http', | ||||
|         // since otherwise, the header will be included in the CONNECT tunnel | ||||
|         // request instead. | ||||
|         if dst.scheme_part() != Some(&::http::uri::Scheme::HTTP) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if headers.contains_key(PROXY_AUTHORIZATION) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|  | ||||
|         for proxy in self.inner.proxies.iter() { | ||||
|             if proxy.is_match(dst) { | ||||
|                 match proxy.auth() { | ||||
|                     Some(::proxy::Auth::Basic(ref header)) => { | ||||
|                         headers.insert( | ||||
|                             PROXY_AUTHORIZATION, | ||||
|                             header.clone() | ||||
|                         ); | ||||
|                     }, | ||||
|                     None => (), | ||||
|                 } | ||||
|  | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl fmt::Debug for Client { | ||||
| @@ -520,6 +576,8 @@ struct ClientRef { | ||||
|     hyper: HyperClient, | ||||
|     redirect_policy: RedirectPolicy, | ||||
|     referer: bool, | ||||
|     proxies: Arc<Vec<Proxy>>, | ||||
|     proxies_maybe_http_auth: bool, | ||||
| } | ||||
|  | ||||
| pub struct Pending { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user