From 51744804dab066f90ad8569e95bd97b75deb8cdb Mon Sep 17 00:00:00 2001 From: Martin Algesten Date: Sun, 1 Jul 2018 18:33:50 +0200 Subject: [PATCH] avoid parsing when setting headers --- src/agent.rs | 17 ++++++++--------- src/header.rs | 7 +++++++ src/request.rs | 16 +++++++--------- src/unit.rs | 3 +-- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/agent.rs b/src/agent.rs index 4b63718..0254d2a 100644 --- a/src/agent.rs +++ b/src/agent.rs @@ -117,9 +117,10 @@ impl Agent { K: Into, V: Into, { - let s = format!("{}: {}", header.into(), value.into()); - let header = s.parse::
().expect("Failed to parse header"); - add_header(&mut self.headers, header); + add_header( + &mut self.headers, + Header::new(&header.into(), &value.into()).expect("Failed to parse header"), + ); self } @@ -153,9 +154,7 @@ impl Agent { I: IntoIterator, { for (k, v) in headers.into_iter() { - let s = format!("{}: {}", k.into(), v.into()); - let header = s.parse::
().expect("Failed to parse header"); - add_header(&mut self.headers, header); + self.set(k, v); } self } @@ -187,6 +186,7 @@ impl Agent { /// in all requests using the agent. /// /// ``` + /// // sets a header "Authorization: token secret" /// let agent = ureq::agent() /// .auth_kind("token", "secret") /// .build(); @@ -200,9 +200,8 @@ impl Agent { S: Into, T: Into, { - let s = format!("Authorization: {} {}", kind.into(), pass.into()); - let header = s.parse::
().expect("Failed to parse header"); - add_header(&mut self.headers, header); + let value = format!("{} {}", kind.into(), pass.into()); + self.set("Authorization", value); self } diff --git a/src/header.rs b/src/header.rs index e823e68..2a1330f 100644 --- a/src/header.rs +++ b/src/header.rs @@ -16,6 +16,13 @@ impl ::std::fmt::Debug for Header { } impl Header { + pub fn new(name: &str, value: &str) -> Result { + let line = + AsciiString::from_str(&format!("{}: {}", name, value)).map_err(|_| Error::BadHeader)?; + let index = name.len(); + Ok(Header { line, index }) + } + /// The header name. /// /// ``` diff --git a/src/request.rs b/src/request.rs index 21d600f..dd6b774 100644 --- a/src/request.rs +++ b/src/request.rs @@ -192,9 +192,10 @@ impl Request { K: Into, V: Into, { - let s = format!("{}: {}", header.into(), value.into()); - let header = s.parse::
().expect("Failed to parse header"); - add_header(&mut self.headers, header); + add_header( + &mut self.headers, + Header::new(&header.into(), &value.into()).expect("Failed to parse header"), + ); self } @@ -264,9 +265,7 @@ impl Request { I: IntoIterator, { for (k, v) in headers.into_iter() { - let s = format!("{}: {}", k.into(), v.into()); - let header = s.parse::
().expect("Failed to parse header"); - add_header(&mut self.headers, header); + self.set(k, v); } self } @@ -424,9 +423,8 @@ impl Request { S: Into, T: Into, { - let s = format!("Authorization: {} {}", kind.into(), pass.into()); - let header = s.parse::
().expect("Failed to parse header"); - add_header(&mut self.headers, header); + let value = format!("{} {}", kind.into(), pass.into()); + self.set("Authorization", value); self } diff --git a/src/unit.rs b/src/unit.rs index ead25e0..0a76064 100644 --- a/src/unit.rs +++ b/src/unit.rs @@ -204,8 +204,7 @@ fn match_cookies<'a>(jar: &'a CookieJar, domain: &str, path: &str, is_secure: bo let name = c.name().to_string(); let value = c.value().to_string(); let nameval = Cookie::new(name, value).encoded().to_string(); - let head = format!("Cookie: {}", nameval); - head.parse::
().ok() + Header::new("Cookie", &nameval).ok() }) .filter(|o| o.is_some()) .map(|o| o.unwrap())