Merge pull request #75 from imp/response_url
Expose final response URL as it is reported by hyper
This commit is contained in:
@@ -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(),
|
||||
|
||||
@@ -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())));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user