diff --git a/src/response.rs b/src/response.rs index d7226a7..1b7ce03 100644 --- a/src/response.rs +++ b/src/response.rs @@ -4,6 +4,7 @@ use std::io::{self, Read}; use hyper::header::{Headers, ContentEncoding, ContentLength, Encoding, TransferEncoding}; use hyper::status::StatusCode; use hyper::version::HttpVersion; +use hyper::Url; use serde::Deserialize; use serde_json; @@ -24,13 +25,15 @@ impl fmt::Debug for Response { return match &self.inner { &Decoder::PlainText(ref hyper_response) => { f.debug_struct("Response") + .field("url", &hyper_response.url) .field("status", &hyper_response.status) .field("headers", &hyper_response.headers) .field("version", &hyper_response.version) .finish() }, - &Decoder::Gzip{ref status, ref version, ref headers, ..} => { + &Decoder::Gzip{ref url, ref status, ref version, ref headers, ..} => { f.debug_struct("Response") + .field("url", &url) .field("status", &status) .field("headers", &headers) .field("version", &version) @@ -41,6 +44,15 @@ impl fmt::Debug for Response { } impl Response { + /// Get the final `Url` of this response. + #[inline] + pub fn url(&self) -> &Url { + match &self.inner { + &Decoder::PlainText(ref hyper_response) => &hyper_response.url, + &Decoder::Gzip{ref url, ..} => url, + } + } + /// Get the `StatusCode`. #[inline] pub fn status(&self) -> &StatusCode { @@ -81,6 +93,7 @@ enum Decoder { /// A `Gzip` decoder will uncompress the gziped response content before returning it. Gzip { decoder: ::libflate::gzip::Decoder<::hyper::client::Response>, + url: ::hyper::Url, headers: ::hyper::header::Headers, version: ::hyper::version::HttpVersion, status: ::hyper::status::StatusCode, @@ -121,6 +134,7 @@ impl Decoder { } if is_gzip { return Decoder::Gzip { + url: res.url.clone(), status: res.status.clone(), version: res.version.clone(), headers: res.headers.clone(), diff --git a/tests/client.rs b/tests/client.rs index 7af28a6..dc9c828 100644 --- a/tests/client.rs +++ b/tests/client.rs @@ -25,7 +25,10 @@ fn test_get() { " }; - let mut res = reqwest::get(&format!("http://{}/1", server.addr())).unwrap(); + let url = format!("http://{}/1", server.addr()); + let mut res = reqwest::get(&url).unwrap(); + + 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()))); @@ -78,9 +81,12 @@ fn test_redirect_301_and_302_and_303_changes_post_to_get() { " }; - let res = client.post(&format!("http://{}/{}", redirect.addr(), code)) + let url = format!("http://{}/{}", redirect.addr(), code); + let dst = format!("http://{}/{}", redirect.addr(), "dst"); + 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()))); } @@ -130,10 +136,13 @@ fn test_redirect_307_and_308_tries_to_post_again() { " }; - let res = client.post(&format!("http://{}/{}", redirect.addr(), code)) + let url = format!("http://{}/{}", redirect.addr(), code); + let dst = format!("http://{}/{}", redirect.addr(), "dst"); + 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()))); } @@ -167,10 +176,12 @@ fn test_redirect_307_does_not_try_if_reader_cannot_reset() { ", code) }; - let res = client.post(&format!("http://{}/{}", redirect.addr(), code)) + let url = format!("http://{}/{}", redirect.addr(), code); + let res = client.post(&url) .body(reqwest::Body::new(&b"Hello"[..])) .send() .unwrap(); + assert_eq!(res.url().as_str(), url); assert_eq!(res.status(), &reqwest::StatusCode::from_u16(code)); } } @@ -224,10 +235,12 @@ fn test_redirect_policy_can_stop_redirects_without_an_error() { let mut client = reqwest::Client::new().unwrap(); client.redirect(reqwest::RedirectPolicy::none()); - let res = client.get(&format!("http://{}/no-redirect", server.addr())) + let url = format!("http://{}/no-redirect", server.addr()); + 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()))); }