make sensitive header check include port
- adjusts to use &mut Headers - add integration test
This commit is contained in:
@@ -364,7 +364,7 @@ impl RequestBuilder {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
headers = remove_sensitive_headers(headers, &url, &urls);
|
remove_sensitive_headers(&mut headers, &url, &urls);
|
||||||
debug!("redirecting to {:?} '{}'", method, url);
|
debug!("redirecting to {:?} '{}'", method, url);
|
||||||
} else {
|
} else {
|
||||||
return Ok(::response::new(res, client.auto_ungzip.load(Ordering::Relaxed)))
|
return Ok(::response::new(res, client.auto_ungzip.load(Ordering::Relaxed)))
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use ::Url;
|
use hyper::header::{Headers, Authorization, Cookie};
|
||||||
|
|
||||||
#[allow(unused_imports)]
|
use ::Url;
|
||||||
use hyper::header::{Headers, Authorization, Cookie, Accept};
|
|
||||||
|
|
||||||
/// A type that controls the policy on how to handle the following of redirects.
|
/// A type that controls the policy on how to handle the following of redirects.
|
||||||
///
|
///
|
||||||
@@ -182,14 +181,17 @@ pub fn check_redirect(policy: &RedirectPolicy, next: &Url, previous: &[Url]) ->
|
|||||||
}).inner
|
}).inner
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_sensitive_headers(mut headers: Headers, next: &Url, previous: &[Url]) -> Headers {
|
pub fn remove_sensitive_headers(headers: &mut Headers, next: &Url, previous: &[Url]) {
|
||||||
let cross_host = next.host().unwrap() != previous.last().unwrap().host().unwrap();
|
if let Some(previous) = previous.last() {
|
||||||
if cross_host {
|
let cross_host = next.host_str() != previous.host_str()
|
||||||
headers.remove::<Authorization<String>>();
|
|| next.port_or_known_default() != previous.port_or_known_default();
|
||||||
headers.remove::<Cookie>();
|
if cross_host {
|
||||||
headers.remove_raw("www-authenticate");
|
headers.remove::<Authorization<String>>();
|
||||||
|
headers.remove::<Cookie>();
|
||||||
|
headers.remove_raw("cookie2");
|
||||||
|
headers.remove_raw("www-authenticate");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
headers
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -245,6 +247,8 @@ fn test_redirect_policy_custom() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_remove_sensitive_headers() {
|
fn test_remove_sensitive_headers() {
|
||||||
|
use hyper::header::Accept;
|
||||||
|
|
||||||
let mut headers = Headers::new();
|
let mut headers = Headers::new();
|
||||||
headers.set(Accept::star());
|
headers.set(Accept::star());
|
||||||
headers.set(Authorization("let me in".to_owned()));
|
headers.set(Authorization("let me in".to_owned()));
|
||||||
@@ -256,13 +260,15 @@ fn test_remove_sensitive_headers() {
|
|||||||
|
|
||||||
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 prev = vec![Url::parse("http://initial-domain.com/new_path").unwrap()];
|
||||||
|
let mut filtered_headers = headers.clone();
|
||||||
assert_eq!(remove_sensitive_headers(headers.clone(), &next, &prev), headers);
|
|
||||||
|
remove_sensitive_headers(&mut headers, &next, &prev);
|
||||||
|
assert_eq!(headers, filtered_headers);
|
||||||
|
|
||||||
prev.push(Url::parse("http://new-domain.com/path").unwrap());
|
prev.push(Url::parse("http://new-domain.com/path").unwrap());
|
||||||
let mut filtered_headers = headers.clone();
|
|
||||||
filtered_headers.remove::<Authorization<String>>();
|
filtered_headers.remove::<Authorization<String>>();
|
||||||
filtered_headers.remove::<Cookie>();
|
filtered_headers.remove::<Cookie>();
|
||||||
|
|
||||||
assert_eq!(remove_sensitive_headers(headers.clone(), &next, &prev), filtered_headers);
|
remove_sensitive_headers(&mut headers, &next, &prev);
|
||||||
}
|
assert_eq!(headers, filtered_headers);
|
||||||
|
}
|
||||||
|
|||||||
@@ -186,6 +186,55 @@ fn test_redirect_307_does_not_try_if_reader_cannot_reset() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_redirect_removes_sensitive_headers() {
|
||||||
|
let end_server = server! {
|
||||||
|
request: b"\
|
||||||
|
GET /otherhost HTTP/1.1\r\n\
|
||||||
|
Host: $HOST\r\n\
|
||||||
|
User-Agent: $USERAGENT\r\n\
|
||||||
|
Accept: */*\r\n\
|
||||||
|
Accept-Encoding: gzip\r\n\
|
||||||
|
\r\n\
|
||||||
|
",
|
||||||
|
response: b"\
|
||||||
|
HTTP/1.1 200 OK\r\n\
|
||||||
|
Server: test\r\n\
|
||||||
|
Content-Length: 0\r\n\
|
||||||
|
\r\n\
|
||||||
|
"
|
||||||
|
};
|
||||||
|
|
||||||
|
let mid_server = server! {
|
||||||
|
request: b"\
|
||||||
|
GET /sensitive HTTP/1.1\r\n\
|
||||||
|
Host: $HOST\r\n\
|
||||||
|
Cookie: foo=bar\r\n\
|
||||||
|
User-Agent: $USERAGENT\r\n\
|
||||||
|
Accept: */*\r\n\
|
||||||
|
Accept-Encoding: gzip\r\n\
|
||||||
|
\r\n\
|
||||||
|
",
|
||||||
|
response: format!("\
|
||||||
|
HTTP/1.1 302 Found\r\n\
|
||||||
|
Server: test\r\n\
|
||||||
|
Location: http://{}/otherhost\r\n\
|
||||||
|
Content-Length: 0\r\n\
|
||||||
|
\r\n\
|
||||||
|
", end_server.addr())
|
||||||
|
};
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_redirect_policy_can_return_errors() {
|
fn test_redirect_policy_can_return_errors() {
|
||||||
let server = server! {
|
let server = server! {
|
||||||
|
|||||||
Reference in New Issue
Block a user