diff --git a/.travis.yml b/.travis.yml index ef28796..aa15423 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,7 @@ matrix: - rust: nightly sudo: false +dist: trusty cache: apt: true diff --git a/examples/response_json.rs b/examples/response_json.rs index faa463e..b3dbc08 100644 --- a/examples/response_json.rs +++ b/examples/response_json.rs @@ -1,7 +1,9 @@ //! `cargo run --example response_json` extern crate reqwest; -#[macro_use] extern crate serde_derive; -#[macro_use] extern crate error_chain; +#[macro_use] +extern crate serde_derive; +#[macro_use] +extern crate error_chain; error_chain! { foreign_links { diff --git a/examples/simple.rs b/examples/simple.rs index d8c8284..12e2c00 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -1,7 +1,8 @@ //! `cargo run --example simple` extern crate reqwest; extern crate env_logger; -#[macro_use] extern crate error_chain; +#[macro_use] +extern crate error_chain; error_chain! { foreign_links { @@ -11,8 +12,7 @@ error_chain! { } fn run() -> Result<()> { - env_logger::init() - .expect("Failed to initialize logger"); + env_logger::init().expect("Failed to initialize logger"); println!("GET https://www.rust-lang.org"); diff --git a/src/body.rs b/src/body.rs index 6188f29..e05cf63 100644 --- a/src/body.rs +++ b/src/body.rs @@ -49,13 +49,10 @@ impl Body { pub fn read_to_string(mut body: Body) -> ::std::io::Result { let mut s = String::new(); match body.reader { - Kind::Reader(ref mut reader, _) => { - reader.read_to_string(&mut s) + Kind::Reader(ref mut reader, _) => reader.read_to_string(&mut s), + Kind::Bytes(ref mut bytes) => (&**bytes).read_to_string(&mut s), } - Kind::Bytes(ref mut bytes) => { - (&**bytes).read_to_string(&mut s) - } - }.map(|_| s) + .map(|_| s) } enum Kind { diff --git a/src/client.rs b/src/client.rs index 56a10b0..4dc260e 100644 --- a/src/client.rs +++ b/src/client.rs @@ -5,11 +5,11 @@ use std::time::Duration; use hyper::client::IntoUrl; use hyper::header::{Headers, ContentType, Location, Referer, UserAgent, Accept, Encoding, - AcceptEncoding, Range, qitem}; + AcceptEncoding, Range, qitem}; use hyper::method::Method; use hyper::status::StatusCode; use hyper::version::HttpVersion; -use hyper::{Url}; +use hyper::Url; use hyper_native_tls::{NativeTlsClient, native_tls}; @@ -17,11 +17,12 @@ use serde::Serialize; use serde_json; use serde_urlencoded; -use ::body::{self, Body}; -use ::redirect::{self, RedirectPolicy, check_redirect, remove_sensitive_headers}; -use ::response::Response; +use body::{self, Body}; +use redirect::{self, RedirectPolicy, check_redirect, remove_sensitive_headers}; +use response::Response; -static DEFAULT_USER_AGENT: &'static str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")); +static DEFAULT_USER_AGENT: &'static str = + concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")); /// A `Client` to make Requests with. /// @@ -76,7 +77,8 @@ impl Certificate { pub fn from_der(der: &[u8]) -> ::Result { let inner = try_!( native_tls::Certificate::from_der(der) - .map_err(|e| ::hyper::Error::Ssl(Box::new(e)))); + .map_err(|e| ::hyper::Error::Ssl(Box::new(e))) + ); Ok(Certificate(inner)) } } @@ -121,7 +123,8 @@ impl ClientBuilder { pub fn new() -> ::Result { let tls_connector_builder = try_!( native_tls::TlsConnector::builder() - .map_err(|e| ::hyper::Error::Ssl(Box::new(e)))); + .map_err(|e| ::hyper::Error::Ssl(Box::new(e))) + ); Ok(ClientBuilder { config: Some(Config { hostname_verification: true, @@ -140,7 +143,11 @@ impl ClientBuilder { let config = self.take_config(); let tls_connector = try_!( - config.tls.build().map_err(|e| ::hyper::Error::Ssl(Box::new(e)))); + config + .tls + .build() + .map_err(|e| ::hyper::Error::Ssl(Box::new(e))) + ); let mut tls_client = NativeTlsClient::from(tls_connector); if !config.hostname_verification { tls_client.danger_disable_hostname_verification(true); @@ -149,7 +156,9 @@ impl ClientBuilder { let mut hyper_client = ::hyper::Client::with_connector( ::hyper::client::Pool::with_connector( Default::default(), - ::hyper::net::HttpsConnector::new(tls_client))); + ::hyper::net::HttpsConnector::new(tls_client), + ) + ); hyper_client.set_redirect_policy(::hyper::client::RedirectPolicy::FollowNone); @@ -168,8 +177,12 @@ impl ClientBuilder { /// This can be used to connect to a server that has a self-signed /// certificate for example. pub fn add_root_certificate(&mut self, cert: Certificate) -> ::Result<&mut ClientBuilder> { - try_!(self.config_mut().tls.add_root_certificate(cert.0) - .map_err(|e| ::hyper::Error::Ssl(Box::new(e)))); + try_!( + self.config_mut() + .tls + .add_root_certificate(cert.0) + .map_err(|e| ::hyper::Error::Ssl(Box::new(e))) + ); Ok(self) } @@ -192,11 +205,15 @@ impl ClientBuilder { // private fn config_mut(&mut self) -> &mut Config { - self.config.as_mut().expect("ClientBuilder cannot be reused after building a Client") + self.config + .as_mut() + .expect("ClientBuilder cannot be reused after building a Client") } fn take_config(&mut self) -> Config { - self.config.take().expect("ClientBuilder cannot be reused after building a Client") + self.config + .take() + .expect("ClientBuilder cannot be reused after building a Client") } } @@ -327,7 +344,10 @@ impl RequestBuilder { /// # Ok(()) /// # } /// ``` - pub fn header(mut self, header: H) -> RequestBuilder { + pub fn header(mut self, header: H) -> RequestBuilder + where + H: ::header::Header + ::header::HeaderFormat, + { self.headers.set(header); self } @@ -341,7 +361,9 @@ impl RequestBuilder { /// Enable HTTP basic authentication. pub fn basic_auth(self, username: U, password: Option

) -> RequestBuilder - where U: Into, P: Into + where + U: Into, + P: Into, { self.header(::header::Authorization(::header::Basic{ username: username.into(), @@ -456,13 +478,13 @@ impl RequestBuilder { StatusCode::SeeOther => { body = None; match method { - Method::Get | Method::Head => {}, + Method::Get | Method::Head => {} _ => { method = Method::Get; } } true - }, + } StatusCode::TemporaryRedirect | StatusCode::PermanentRedirect => { if let Some(ref body) = body { @@ -470,7 +492,7 @@ impl RequestBuilder { } else { true } - }, + } _ => false, }; @@ -492,33 +514,34 @@ impl RequestBuilder { } } urls.push(url); - let action = check_redirect(&client.redirect_policy.lock().unwrap(), &loc, &urls); + let action = + check_redirect(&client.redirect_policy.lock().unwrap(), &loc, &urls); match action { redirect::Action::Follow => loc, redirect::Action::Stop => { debug!("redirect_policy disallowed redirection to '{}'", loc); return Ok(::response::new(res, client.auto_ungzip.load(Ordering::Relaxed))); - }, + } redirect::Action::LoopDetected => { return Err(::error::loop_detected(res.url.clone())); - }, + } redirect::Action::TooManyRedirects => { return Err(::error::too_many_redirects(res.url.clone())); } } - }, + } Err(e) => { debug!("Location header had invalid URI: {:?}", e); - return Ok(::response::new(res, client.auto_ungzip.load(Ordering::Relaxed))) + return Ok(::response::new(res, client.auto_ungzip.load(Ordering::Relaxed))); } }; remove_sensitive_headers(&mut headers, &url, &urls); debug!("redirecting to {:?} '{}'", method, url); } else { - return Ok(::response::new(res, client.auto_ungzip.load(Ordering::Relaxed))) + return Ok(::response::new(res, client.auto_ungzip.load(Ordering::Relaxed))); } } } @@ -549,7 +572,7 @@ fn make_referer(next: &Url, previous: &Url) -> Option { #[cfg(test)] mod tests { use super::*; - use ::body; + use body; use hyper::method::Method; use hyper::Url; use hyper::header::{Host, Headers, ContentType}; @@ -683,7 +706,8 @@ mod tests { r = r.form(&form_data); // Make sure the content type was set - assert_eq!(r.headers.get::(), Some(&ContentType::form_url_encoded())); + assert_eq!(r.headers.get::(), + Some(&ContentType::form_url_encoded())); let buf = body::read_to_string(r.body.unwrap().unwrap()).unwrap(); diff --git a/src/error.rs b/src/error.rs index 9eba058..da77788 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,7 +1,7 @@ use std::error::Error as StdError; use std::fmt; -use ::Url; +use Url; /// The Errors that may occur when processing a `Request`. #[derive(Debug)] @@ -153,10 +153,12 @@ impl From> for Error { } impl From> for Error -where T: Into { +where + T: Into, +{ #[inline] fn from(other: InternalFrom) -> Error { - Error { + Error { kind: other.0.into(), url: other.1, } @@ -165,7 +167,9 @@ where T: Into { #[inline] pub fn from(err: T) -> Error -where T: Into { +where + T: Into, +{ InternalFrom(err, None).into() } @@ -188,11 +192,13 @@ pub fn too_many_redirects(url: Url) -> Error { #[test] fn test_error_get_ref_downcasts() { let err: Error = from(::hyper::Error::Status); - let cause = err.get_ref().unwrap() - .downcast_ref::<::hyper::Error>().unwrap(); + let cause = err.get_ref() + .unwrap() + .downcast_ref::<::hyper::Error>() + .unwrap(); match cause { &::hyper::Error::Status => (), - _ => panic!("unexpected downcast: {:?}", cause) + _ => panic!("unexpected downcast: {:?}", cause), } } diff --git a/src/lib.rs b/src/lib.rs index 3b25fd1..e9080af 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -115,7 +115,8 @@ //! [serde]: http://serde.rs extern crate hyper; -#[macro_use] extern crate log; +#[macro_use] +extern crate log; extern crate libflate; extern crate hyper_native_tls; extern crate serde; diff --git a/src/redirect.rs b/src/redirect.rs index 695cf3c..101d8d3 100644 --- a/src/redirect.rs +++ b/src/redirect.rs @@ -2,7 +2,7 @@ use std::fmt; use hyper::header::{Headers, Authorization, Cookie}; -use ::Url; +use Url; /// A type that controls the policy on how to handle the following of redirects. /// @@ -77,7 +77,9 @@ impl RedirectPolicy { /// # } /// ``` pub fn custom(policy: T) -> RedirectPolicy - where T: Fn(RedirectAttempt) -> RedirectAction + Send + Sync + 'static { + where + T: Fn(RedirectAttempt) -> RedirectAction + Send + Sync + 'static, + { RedirectPolicy { inner: Policy::Custom(Box::new(policy)), } @@ -94,7 +96,7 @@ impl RedirectPolicy { } else { attempt.follow() } - }, + } Policy::None => attempt.stop(), } } @@ -187,8 +189,8 @@ pub fn check_redirect(policy: &RedirectPolicy, next: &Url, previous: &[Url]) -> pub fn remove_sensitive_headers(headers: &mut Headers, next: &Url, previous: &[Url]) { if let Some(previous) = previous.last() { - let cross_host = next.host_str() != previous.host_str() - || next.port_or_known_default() != previous.port_or_known_default(); + let cross_host = next.host_str() != previous.host_str() || + next.port_or_known_default() != previous.port_or_known_default(); if cross_host { headers.remove::>(); headers.remove::(); @@ -229,7 +231,8 @@ fn test_redirect_policy_limit() { previous.push(Url::parse("http://a.b.d/e/33").unwrap()); - assert_eq!(check_redirect(&policy, &next, &previous), Action::TooManyRedirects); + assert_eq!(check_redirect(&policy, &next, &previous), + Action::TooManyRedirects); } #[test] @@ -256,13 +259,9 @@ fn test_remove_sensitive_headers() { let mut headers = Headers::new(); headers.set(Accept::star()); headers.set(Authorization("let me in".to_owned())); - headers.set( - Cookie(vec![ - String::from("foo=bar") - ]) - ); + headers.set(Cookie(vec![String::from("foo=bar")])); - let next = Url::parse("http://initial-domain.com/path").unwrap(); + let next = Url::parse("http://initial-domain.com/path").unwrap(); let mut prev = vec![Url::parse("http://initial-domain.com/new_path").unwrap()]; let mut filtered_headers = headers.clone(); diff --git a/src/response.rs b/src/response.rs index 21906de..7abb5d4 100644 --- a/src/response.rs +++ b/src/response.rs @@ -18,7 +18,7 @@ pub struct Response { pub fn new(res: ::hyper::client::Response, gzip: bool) -> Response { info!("Response: '{}' for {}", res.status, res.url); Response { - inner: Decoder::from_hyper_response(res, gzip) + inner: Decoder::from_hyper_response(res, gzip), } } @@ -32,8 +32,8 @@ impl fmt::Debug for Response { .field("headers", &hyper_response.headers) .field("version", &hyper_response.version) .finish() - }, - Decoder::Gzip{ ref head, .. } | + } + Decoder::Gzip { ref head, .. } | Decoder::Errored { ref head, .. } => { f.debug_struct("Response") .field("url", &head.url) @@ -52,7 +52,7 @@ impl Response { pub fn url(&self) -> &Url { match self.inner { Decoder::PlainText(ref hyper_response) => &hyper_response.url, - Decoder::Gzip{ ref head, .. } | + Decoder::Gzip { ref head, .. } | Decoder::Errored { ref head, .. } => &head.url, } } @@ -62,7 +62,7 @@ impl Response { pub fn status(&self) -> &StatusCode { match self.inner { Decoder::PlainText(ref hyper_response) => &hyper_response.status, - Decoder::Gzip{ ref head, .. } | + Decoder::Gzip { ref head, .. } | Decoder::Errored { ref head, .. } => &head.status, } } @@ -72,7 +72,7 @@ impl Response { pub fn headers(&self) -> &Headers { match self.inner { Decoder::PlainText(ref hyper_response) => &hyper_response.headers, - Decoder::Gzip{ ref head, .. } | + Decoder::Gzip { ref head, .. } | Decoder::Errored { ref head, .. } => &head.headers, } } @@ -82,7 +82,7 @@ impl Response { pub fn version(&self) -> &HttpVersion { match self.inner { Decoder::PlainText(ref hyper_response) => &hyper_response.version, - Decoder::Gzip{ ref head, .. } | + Decoder::Gzip { ref head, .. } | Decoder::Errored { ref head, .. } => &head.version, } } @@ -148,12 +148,13 @@ impl Decoder { } let content_encoding_gzip: bool; let mut is_gzip = { - content_encoding_gzip = res.headers.get::().map_or(false, |encs|{ - encs.contains(&Encoding::Gzip) - }); - content_encoding_gzip || res.headers.get::().map_or(false, |encs|{ - encs.contains(&Encoding::Gzip) - }) + content_encoding_gzip = res.headers + .get::() + .map_or(false, |encs| encs.contains(&Encoding::Gzip)); + content_encoding_gzip || + res.headers + .get::() + .map_or(false, |encs| encs.contains(&Encoding::Gzip)) }; if is_gzip { if let Some(content_length) = res.headers.get::() { @@ -184,7 +185,7 @@ fn new_gzip(mut res: ::hyper::client::Response) -> Decoder { Ok(0) => return Decoder::PlainText(res), Ok(n) => { debug_assert_eq!(n, 1); - }, + } Err(e) => return Decoder::Errored { err: Some(e), head: Head { @@ -193,7 +194,7 @@ fn new_gzip(mut res: ::hyper::client::Response) -> Decoder { url: res.url.clone(), version: res.version, } - }, + } } let head = Head { @@ -249,12 +250,8 @@ impl Read for Peeked { impl Read for Decoder { fn read(&mut self, buf: &mut [u8]) -> io::Result { match *self { - Decoder::PlainText(ref mut hyper_response) => { - hyper_response.read(buf) - }, - Decoder::Gzip{ref mut decoder, ..} => { - decoder.read(buf) - }, + Decoder::PlainText(ref mut hyper_response) => hyper_response.read(buf), + Decoder::Gzip { ref mut decoder, .. } => decoder.read(buf), Decoder::Errored { ref mut err, .. } => { Err(err.take().unwrap_or_else(previously_errored)) } @@ -274,4 +271,3 @@ impl Read for Response { self.inner.read(buf) } } - diff --git a/tests/client.rs b/tests/client.rs index e260840..e2a6792 100644 --- a/tests/client.rs +++ b/tests/client.rs @@ -1,7 +1,8 @@ extern crate reqwest; extern crate libflate; -#[macro_use] mod server; +#[macro_use] +mod server; use std::io::Read; use std::io::prelude::*; @@ -31,8 +32,10 @@ fn test_get() { assert_eq!(res.url().as_str(), &url); assert_eq!(res.status(), &reqwest::StatusCode::Ok); assert_eq!(res.version(), &reqwest::HttpVersion::Http11); - assert_eq!(res.headers().get(), Some(&reqwest::header::Server("test".to_string()))); - assert_eq!(res.headers().get(), Some(&reqwest::header::ContentLength(0))); + assert_eq!(res.headers().get(), + Some(&reqwest::header::Server("test".to_string()))); + assert_eq!(res.headers().get(), + Some(&reqwest::header::ContentLength(0))); let mut buf = [0; 1024]; let n = res.read(&mut buf).unwrap(); @@ -83,12 +86,11 @@ fn test_redirect_301_and_302_and_303_changes_post_to_get() { let url = format!("http://{}/{}", redirect.addr(), code); let dst = format!("http://{}/{}", redirect.addr(), "dst"); - let res = client.post(&url) - .send() - .unwrap(); + let res = client.post(&url).send().unwrap(); assert_eq!(res.url().as_str(), dst); assert_eq!(res.status(), &reqwest::StatusCode::Ok); - assert_eq!(res.headers().get(), Some(&reqwest::header::Server("test-dst".to_string()))); + assert_eq!(res.headers().get(), + Some(&reqwest::header::Server("test-dst".to_string()))); } } @@ -138,13 +140,11 @@ fn test_redirect_307_and_308_tries_to_post_again() { let url = format!("http://{}/{}", redirect.addr(), code); let dst = format!("http://{}/{}", redirect.addr(), "dst"); - let res = client.post(&url) - .body("Hello") - .send() - .unwrap(); + let res = client.post(&url).body("Hello").send().unwrap(); assert_eq!(res.url().as_str(), dst); assert_eq!(res.status(), &reqwest::StatusCode::Ok); - assert_eq!(res.headers().get(), Some(&reqwest::header::Server("test-dst".to_string()))); + assert_eq!(res.headers().get(), + Some(&reqwest::header::Server("test-dst".to_string()))); } } @@ -177,7 +177,8 @@ fn test_redirect_307_does_not_try_if_reader_cannot_reset() { }; let url = format!("http://{}/{}", redirect.addr(), code); - let res = client.post(&url) + let res = client + .post(&url) .body(reqwest::Body::new(&b"Hello"[..])) .send() .unwrap(); @@ -226,13 +227,11 @@ fn test_redirect_removes_sensitive_headers() { let mut client = reqwest::Client::new().unwrap(); client.referer(false); - client.get(&format!("http://{}/sensitive", mid_server.addr())) - .header( - reqwest::header::Cookie(vec![ - String::from("foo=bar") - ]) - ) - .send().unwrap(); + client + .get(&format!("http://{}/sensitive", mid_server.addr())) + .header(reqwest::header::Cookie(vec![String::from("foo=bar")])) + .send() + .unwrap(); } #[test] @@ -282,13 +281,12 @@ fn test_redirect_policy_can_stop_redirects_without_an_error() { client.redirect(reqwest::RedirectPolicy::none()); let url = format!("http://{}/no-redirect", server.addr()); - let res = client.get(&url) - .send() - .unwrap(); + let res = client.get(&url).send().unwrap(); assert_eq!(res.url().as_str(), url); assert_eq!(res.status(), &reqwest::StatusCode::Found); - assert_eq!(res.headers().get(), Some(&reqwest::header::Server("test-dont".to_string()))); + assert_eq!(res.headers().get(), + Some(&reqwest::header::Server("test-dont".to_string()))); } #[test] @@ -328,8 +326,10 @@ fn test_referer_is_not_set_if_disabled() { }; let mut client = reqwest::Client::new().unwrap(); client.referer(false); - client.get(&format!("http://{}/no-refer", server.addr())) - .send().unwrap(); + client + .get(&format!("http://{}/no-refer", server.addr())) + .send() + .unwrap(); } #[test] @@ -352,7 +352,8 @@ fn test_accept_header_is_not_changed_if_set() { }; let client = reqwest::Client::new().unwrap(); - let res = client.get(&format!("http://{}/accept", server.addr())) + let res = client + .get(&format!("http://{}/accept", server.addr())) .header(reqwest::header::Accept::json()) .send() .unwrap(); @@ -395,7 +396,7 @@ fn test_gzip_response() { let mut encoder = ::libflate::gzip::Encoder::new(Vec::new()).unwrap(); match encoder.write(b"test request") { Ok(n) => assert!(n > 0, "Failed to write to encoder."), - _ => panic!("Failed to gzip encode string.") + _ => panic!("Failed to gzip encode string."), }; let gzipped_content = encoder.finish().into_result().unwrap(); @@ -420,13 +421,12 @@ fn test_gzip_response() { ", response: response }; - let mut res = reqwest::get(&format!("http://{}/gzip", server.addr())) - .unwrap(); + let mut res = reqwest::get(&format!("http://{}/gzip", server.addr())).unwrap(); let mut body = ::std::string::String::new(); match res.read_to_string(&mut body) { Ok(n) => assert!(n > 0, "Failed to write to buffer."), - _ => panic!("Failed to write to buffer.") + _ => panic!("Failed to write to buffer."), }; assert_eq!(body, "test request"); @@ -452,7 +452,8 @@ fn test_gzip_empty_body() { }; let client = reqwest::Client::new().unwrap(); - let mut res = client.head(&format!("http://{}/gzip", server.addr())) + let mut res = client + .head(&format!("http://{}/gzip", server.addr())) .send() .unwrap(); @@ -482,8 +483,7 @@ fn test_gzip_invalid_body() { 0" }; - let mut res = reqwest::get(&format!("http://{}/gzip", server.addr())) - .unwrap(); + let mut res = reqwest::get(&format!("http://{}/gzip", server.addr())).unwrap(); // this tests that the request.send() didn't error, but that the error // is in reading the body diff --git a/tests/server.rs b/tests/server.rs index 749b8fd..3ebf81b 100644 --- a/tests/server.rs +++ b/tests/server.rs @@ -14,13 +14,14 @@ impl Server { } } -static DEFAULT_USER_AGENT: &'static str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")); +static DEFAULT_USER_AGENT: &'static str = + concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")); pub fn spawn(txns: Vec<(Vec, Vec)>) -> Server { let listener = net::TcpListener::bind("127.0.0.1:0").unwrap(); let addr = listener.local_addr().unwrap(); - thread::spawn(move || { - for (mut expected, reply) in txns { + thread::spawn( + move || for (mut expected, reply) in txns { let (mut socket, _addr) = listener.accept().unwrap(); replace_expected_vars(&mut expected, addr.to_string().as_ref(), DEFAULT_USER_AGENT.as_ref()); let mut buf = [0; 4096]; @@ -28,11 +29,11 @@ pub fn spawn(txns: Vec<(Vec, Vec)>) -> Server { match (::std::str::from_utf8(&expected), ::std::str::from_utf8(&buf[..n])) { (Ok(expected), Ok(received)) => assert_eq!(expected, received), - _ => assert_eq!(expected, &buf[..n]) + _ => assert_eq!(expected, &buf[..n]), } socket.write_all(&reply).unwrap(); } - }); + ); Server { addr: addr,