get -> header

This commit is contained in:
Martin Algesten
2018-06-12 19:48:34 +02:00
parent 89aafaa439
commit 729f907fe0
9 changed files with 80 additions and 56 deletions

View File

@@ -60,7 +60,7 @@ impl ConnectionPool {
} }
// the location header // the location header
let location = resp.get("location"); let location = resp.header("location");
if let Some(location) = location { if let Some(location) = location {
// join location header to current url in case it it relative // join location header to current url in case it it relative
let new_url = url.join(location) let new_url = url.join(location)
@@ -155,14 +155,14 @@ fn send_payload(request: &Request, payload: Payload, stream: &mut Stream) -> IoR
// //
let (size, reader) = payload.into_read(); let (size, reader) = payload.into_read();
let do_chunk = request.get("transfer-encoding") let do_chunk = request.header("transfer-encoding")
// if the user has set an encoding header, obey that. // if the user has set an encoding header, obey that.
.map(|enc| enc.eq_ignore_ascii_case("chunked")) .map(|enc| enc.eq_ignore_ascii_case("chunked"))
// if the content has a size // if the content has a size
.ok_or_else(|| size. .ok_or_else(|| size.
// or if the user set a content-length header // or if the user set a content-length header
or_else(|| or_else(||
request.get("content-length").map(|len| len.parse::<usize>().unwrap_or(0))) request.header("content-length").map(|len| len.parse::<usize>().unwrap_or(0)))
// and that size is larger than 1MB, chunk, // and that size is larger than 1MB, chunk,
.map(|size| size > CHUNK_SIZE)) .map(|size| size > CHUNK_SIZE))
// otherwise, assume chunking since it can be really big. // otherwise, assume chunking since it can be really big.

View File

@@ -128,19 +128,19 @@ where
mod tests { mod tests {
use super::*; use super::*;
//#[test] #[test]
fn connect_http_google() { fn connect_http_google() {
let resp = get("http://www.google.com/").call(); let resp = get("http://www.google.com/").call();
println!("{:?}", resp); println!("{:?}", resp);
assert_eq!("text/html; charset=ISO-8859-1", resp.get("content-type").unwrap()); assert_eq!("text/html; charset=ISO-8859-1", resp.header("content-type").unwrap());
assert_eq!("text/html", resp.content_type()); assert_eq!("text/html", resp.content_type());
} }
//#[test] #[test]
fn connect_https_google() { fn connect_https_google() {
let resp = get("https://www.google.com/").call(); let resp = get("https://www.google.com/").call();
println!("{:?}", resp); println!("{:?}", resp);
assert_eq!("text/html; charset=ISO-8859-1", resp.get("content-type").unwrap()); assert_eq!("text/html; charset=ISO-8859-1", resp.header("content-type").unwrap());
assert_eq!("text/html", resp.content_type()); assert_eq!("text/html", resp.content_type());
} }
} }

View File

@@ -189,9 +189,9 @@ impl Request {
/// let req = ureq::get("/my_page") /// let req = ureq::get("/my_page")
/// .set("X-API-Key", "foobar") /// .set("X-API-Key", "foobar")
/// .build(); /// .build();
/// assert_eq!("foobar", req.get("x-api-Key").unwrap()); /// assert_eq!("foobar", req.header("x-api-Key").unwrap());
/// ``` /// ```
pub fn get<'a>(&self, name: &'a str) -> Option<&str> { pub fn header<'a>(&self, name: &'a str) -> Option<&str> {
self.headers self.headers
.iter() .iter()
.find(|h| h.is_name(name)) .find(|h| h.is_name(name))
@@ -207,7 +207,7 @@ impl Request {
/// assert_eq!(true, req.has("x-api-Key")); /// assert_eq!(true, req.has("x-api-Key"));
/// ``` /// ```
pub fn has<'a>(&self, name: &'a str) -> bool { pub fn has<'a>(&self, name: &'a str) -> bool {
self.get(name).is_some() self.header(name).is_some()
} }
/// All headers corresponding values for the give name, or empty vector. /// All headers corresponding values for the give name, or empty vector.
@@ -217,12 +217,12 @@ impl Request {
/// .set("X-Forwarded-For", "1.2.3.4") /// .set("X-Forwarded-For", "1.2.3.4")
/// .set("X-Forwarded-For", "2.3.4.5") /// .set("X-Forwarded-For", "2.3.4.5")
/// .build(); /// .build();
/// assert_eq!(req.get_all("x-forwarded-for"), vec![ /// assert_eq!(req.all("x-forwarded-for"), vec![
/// "1.2.3.4", /// "1.2.3.4",
/// "2.3.4.5", /// "2.3.4.5",
/// ]); /// ]);
/// ``` /// ```
pub fn get_all<'a>(&self, name: &'a str) -> Vec<&str> { pub fn all<'a>(&self, name: &'a str) -> Vec<&str> {
self.headers self.headers
.iter() .iter()
.filter(|h| h.is_name(name)) .filter(|h| h.is_name(name))

View File

@@ -53,7 +53,7 @@ impl Response {
} }
/// The header corresponding header value for the give name, if any. /// The header corresponding header value for the give name, if any.
pub fn get<'a>(&self, name: &'a str) -> Option<&str> { pub fn header<'a>(&self, name: &'a str) -> Option<&str> {
self.headers self.headers
.iter() .iter()
.find(|h| h.is_name(name)) .find(|h| h.is_name(name))
@@ -62,11 +62,11 @@ impl Response {
/// Tells if the response has the named header. /// Tells if the response has the named header.
pub fn has<'a>(&self, name: &'a str) -> bool { pub fn has<'a>(&self, name: &'a str) -> bool {
self.get(name).is_some() self.header(name).is_some()
} }
/// All headers corresponding values for the give name, or empty vector. /// All headers corresponding values for the give name, or empty vector.
pub fn get_all<'a>(&self, name: &'a str) -> Vec<&str> { pub fn all<'a>(&self, name: &'a str) -> Vec<&str> {
self.headers self.headers
.iter() .iter()
.filter(|h| h.is_name(name)) .filter(|h| h.is_name(name))
@@ -105,11 +105,11 @@ impl Response {
/// ///
/// ``` /// ```
/// let resp = ureq::get("https://www.google.com/").call(); /// let resp = ureq::get("https://www.google.com/").call();
/// assert_eq!("text/html; charset=ISO-8859-1", resp.get("content-type").unwrap()); /// assert_eq!("text/html; charset=ISO-8859-1", resp.header("content-type").unwrap());
/// assert_eq!("text/html", resp.content_type()); /// assert_eq!("text/html", resp.content_type());
/// ``` /// ```
pub fn content_type(&self) -> &str { pub fn content_type(&self) -> &str {
self.get("content-type") self.header("content-type")
.map(|header| { .map(|header| {
header header
.find(";") .find(";")
@@ -119,7 +119,7 @@ impl Response {
.unwrap_or(DEFAULT_CONTENT_TYPE) .unwrap_or(DEFAULT_CONTENT_TYPE)
} }
pub fn charset(&self) -> &str { pub fn charset(&self) -> &str {
self.get("content-type") self.header("content-type")
.and_then(|header| { .and_then(|header| {
header.find(";").and_then(|semi| { header.find(";").and_then(|semi| {
(&header[semi + 1..]) (&header[semi + 1..])
@@ -131,10 +131,10 @@ impl Response {
} }
pub fn into_reader(self) -> impl Read { pub fn into_reader(self) -> impl Read {
let is_chunked = self.get("transfer-encoding") let is_chunked = self.header("transfer-encoding")
.map(|enc| enc.len() > 0) // whatever it says, do chunked .map(|enc| enc.len() > 0) // whatever it says, do chunked
.unwrap_or(false); .unwrap_or(false);
let len = self.get("content-length").and_then(|l| l.parse::<usize>().ok()); let len = self.header("content-length").and_then(|l| l.parse::<usize>().ok());
let reader = self.reader.expect("No reader in response?!"); let reader = self.reader.expect("No reader in response?!");
match is_chunked { match is_chunked {
true => Box::new(chunked_transfer::Decoder::new(reader)), true => Box::new(chunked_transfer::Decoder::new(reader)),

View File

@@ -1,28 +0,0 @@
use test;
use super::super::*;
#[test]
fn agent_reuse_headers() {
let agent = agent()
.set("Authorization", "Foo 12345")
.build();
test::set_handler("/agent_reuse_headers", |req, _url| {
assert!(req.has("Authorization"));
assert_eq!(req.get("Authorization").unwrap(), "Foo 12345");
test::make_stream(200, "OK", vec!["X-Call: 1"], vec![])
});
let resp = agent.get("test://host/agent_reuse_headers").call();
assert_eq!(resp.get("X-Call").unwrap(), "1");
test::set_handler("/agent_reuse_headers", |req, _url| {
assert!(req.has("Authorization"));
assert_eq!(req.get("Authorization").unwrap(), "Foo 12345");
test::make_stream(200, "OK", vec!["X-Call: 2"], vec![])
});
let resp = agent.get("test://host/agent_reuse_headers").call();
assert_eq!(resp.get("X-Call").unwrap(), "2");
}

52
src/test/agent_test.rs Normal file
View File

@@ -0,0 +1,52 @@
use test;
use super::super::*;
#[test]
fn agent_reuse_headers() {
let agent = agent()
.set("Authorization", "Foo 12345")
.build();
test::set_handler("/agent_reuse_headers", |req, _url| {
assert!(req.has("Authorization"));
assert_eq!(req.header("Authorization").unwrap(), "Foo 12345");
test::make_stream(200, "OK", vec!["X-Call: 1"], vec![])
});
let resp = agent.get("test://host/agent_reuse_headers").call();
assert_eq!(resp.header("X-Call").unwrap(), "1");
test::set_handler("/agent_reuse_headers", |req, _url| {
assert!(req.has("Authorization"));
assert_eq!(req.header("Authorization").unwrap(), "Foo 12345");
test::make_stream(200, "OK", vec!["X-Call: 2"], vec![])
});
let resp = agent.get("test://host/agent_reuse_headers").call();
assert_eq!(resp.header("X-Call").unwrap(), "2");
}
#[test]
fn agent_cookies() {
let agent = agent()
.build();
test::set_handler("/agent_cookies", |_req, _url| {
test::make_stream(200, "OK", vec!["Set-Cookie: foo=bar; Path=/; HttpOnly"], vec![])
});
agent.get("test://host/agent_cookies").call();
assert!(agent.cookie("foo").is_some());
assert_eq!(agent.cookie("foo").unwrap().value(), "bar");
test::set_handler("/agent_cookies", |req, _url| {
assert_eq!(req.header("Cookie").unwrap(), "");
test::make_stream(200, "OK", vec![], vec![])
});
agent.get("test://host/agent_cookies").call();
}

View File

@@ -5,7 +5,7 @@ use super::super::*;
#[test] #[test]
fn basic_auth() { fn basic_auth() {
test::set_handler("/basic_auth", |req, _url| { test::set_handler("/basic_auth", |req, _url| {
assert_eq!(req.get("Authorization").unwrap(), "Basic bWFydGluOnJ1YmJlcm1hc2hndW0="); assert_eq!(req.header("Authorization").unwrap(), "Basic bWFydGluOnJ1YmJlcm1hc2hndW0=");
test::make_stream(200, "OK", vec![], vec![]) test::make_stream(200, "OK", vec![], vec![])
}); });
let resp = get("test://host/basic_auth") let resp = get("test://host/basic_auth")
@@ -17,7 +17,7 @@ fn basic_auth() {
#[test] #[test]
fn kind_auth() { fn kind_auth() {
test::set_handler("/kind_auth", |req, _url| { test::set_handler("/kind_auth", |req, _url| {
assert_eq!(req.get("Authorization").unwrap(), "Digest abcdefgh123"); assert_eq!(req.header("Authorization").unwrap(), "Digest abcdefgh123");
test::make_stream(200, "OK", vec![], vec![]) test::make_stream(200, "OK", vec![], vec![])
}); });
let resp = get("test://host/kind_auth") let resp = get("test://host/kind_auth")

View File

@@ -8,7 +8,7 @@ use stream::Stream;
use url::Url; use url::Url;
use util::vecread::VecRead; use util::vecread::VecRead;
mod agent; mod agent_test;
mod auth; mod auth;
mod simple; mod simple;
mod body_read; mod body_read;

View File

@@ -7,20 +7,20 @@ use super::super::*;
fn header_passing() { fn header_passing() {
test::set_handler("/header_passing", |req, _url| { test::set_handler("/header_passing", |req, _url| {
assert!(req.has("X-Foo")); assert!(req.has("X-Foo"));
assert_eq!(req.get("X-Foo").unwrap(), "bar"); assert_eq!(req.header("X-Foo").unwrap(), "bar");
test::make_stream(200, "OK", vec!["X-Bar: foo"], vec![]) test::make_stream(200, "OK", vec!["X-Bar: foo"], vec![])
}); });
let resp = get("test://host/header_passing").set("X-Foo", "bar").call(); let resp = get("test://host/header_passing").set("X-Foo", "bar").call();
assert_eq!(*resp.status(), 200); assert_eq!(*resp.status(), 200);
assert!(resp.has("X-Bar")); assert!(resp.has("X-Bar"));
assert_eq!(resp.get("X-Bar").unwrap(), "foo"); assert_eq!(resp.header("X-Bar").unwrap(), "foo");
} }
#[test] #[test]
fn repeat_non_x_header() { fn repeat_non_x_header() {
test::set_handler("/repeat_non_x_header", |req, _url| { test::set_handler("/repeat_non_x_header", |req, _url| {
assert!(req.has("Accept")); assert!(req.has("Accept"));
assert_eq!(req.get("Accept").unwrap(), "baz"); assert_eq!(req.header("Accept").unwrap(), "baz");
test::make_stream(200, "OK", vec![], vec![]) test::make_stream(200, "OK", vec![], vec![])
}); });
let resp = get("test://host/repeat_non_x_header") let resp = get("test://host/repeat_non_x_header")
@@ -34,8 +34,8 @@ fn repeat_non_x_header() {
fn repeat_x_header() { fn repeat_x_header() {
test::set_handler("/repeat_x_header", |req, _url| { test::set_handler("/repeat_x_header", |req, _url| {
assert!(req.has("X-Forwarded-For")); assert!(req.has("X-Forwarded-For"));
assert_eq!(req.get("X-Forwarded-For").unwrap(), "130.240.19.2"); assert_eq!(req.header("X-Forwarded-For").unwrap(), "130.240.19.2");
assert_eq!(req.get_all("X-Forwarded-For"), vec![ assert_eq!(req.all("X-Forwarded-For"), vec![
"130.240.19.2", "130.240.19.2",
"130.240.19.3", "130.240.19.3",
]); ]);