| @@ -30,7 +30,7 @@ use native_tls::TlsConnector; | ||||
| use super::request::{Request, RequestBuilder}; | ||||
| use super::response::Response; | ||||
| use connect::Connector; | ||||
| use into_url::to_uri; | ||||
| use into_url::{expect_uri, try_uri}; | ||||
| use redirect::{self, RedirectPolicy, remove_sensitive_headers}; | ||||
| use {IntoUrl, Method, Proxy, StatusCode, Url}; | ||||
| #[cfg(feature = "tls")] | ||||
| @@ -520,7 +520,7 @@ impl Client { | ||||
|             headers.insert(ACCEPT_ENCODING, HeaderValue::from_static("gzip")); | ||||
|         } | ||||
|  | ||||
|         let uri = to_uri(&url); | ||||
|         let uri = expect_uri(&url); | ||||
|  | ||||
|         let (reusable, body) = match body { | ||||
|             Some(body) => { | ||||
| @@ -709,6 +709,17 @@ impl Future for PendingRequest { | ||||
|                             self.url.join(str::from_utf8(val.as_bytes()).ok()?).ok() | ||||
|                         })(); | ||||
|  | ||||
|                         // Check that the `url` is also a valid `http::Uri`. | ||||
|                         // | ||||
|                         // If not, just log it and skip the redirect. | ||||
|                         let loc = loc.and_then(|url| { | ||||
|                             if try_uri(&url).is_some() { | ||||
|                                 Some(url) | ||||
|                             } else { | ||||
|                                 None | ||||
|                             } | ||||
|                         }); | ||||
|  | ||||
|                         if loc.is_none() { | ||||
|                             debug!("Location header had invalid URI: {:?}", val); | ||||
|                         } | ||||
| @@ -733,7 +744,7 @@ impl Future for PendingRequest { | ||||
|  | ||||
|                             remove_sensitive_headers(&mut self.headers, &self.url, &self.urls); | ||||
|                             debug!("redirecting to {:?} '{}'", self.method, self.url); | ||||
|                             let uri = to_uri(&self.url); | ||||
|                             let uri = expect_uri(&self.url); | ||||
|                             let body = match self.body { | ||||
|                                 Some(Some(ref body)) => ::hyper::Body::from(body.clone()), | ||||
|                                 _ => ::hyper::Body::empty(), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user