feat(header): implement fmt::Display for several headers

Specifically, `CacheControl`, `Expect`, `Origin`, `Pragma`, `Prefer`,
`PreferenceApplied`, `ReferrerPolicy`, `StrictTransportSecurity`.
This commit is contained in:
Sean McArthur
2017-01-31 13:25:33 -08:00
parent b4b2fb782e
commit e9e7381ece
11 changed files with 77 additions and 17 deletions

View File

@@ -101,6 +101,12 @@ impl<S: Scheme + Any> Header for Authorization<S> where <S as FromStr>::Err: 'st
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl<S: Scheme> fmt::Display for Authorization<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let Some(scheme) = <S as Scheme>::scheme() { if let Some(scheme) = <S as Scheme>::scheme() {
try!(write!(f, "{} ", scheme)) try!(write!(f, "{} ", scheme))
}; };
@@ -152,7 +158,6 @@ impl Scheme for Basic {
if let Some(ref pass) = self.password { if let Some(ref pass) = self.password {
text.push_str(&pass[..]); text.push_str(&pass[..]);
} }
f.write_str(&encode(text.as_ref())) f.write_str(&encode(text.as_ref()))
} }
} }

View File

@@ -65,6 +65,12 @@ impl Header for CacheControl {
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl fmt::Display for CacheControl {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt_comma_delimited(f, &self[..]) fmt_comma_delimited(f, &self[..])
} }
} }

View File

@@ -55,6 +55,12 @@ impl Header for Cookie {
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl fmt::Display for Cookie {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let cookies = &self.0; let cookies = &self.0;
for (i, cookie) in cookies.iter().enumerate() { for (i, cookie) in cookies.iter().enumerate() {
if i != 0 { if i != 0 {
@@ -63,6 +69,7 @@ impl Header for Cookie {
try!(Display::fmt(&cookie, f)); try!(Display::fmt(&cookie, f));
} }
Ok(()) Ok(())
} }
} }

View File

@@ -55,6 +55,12 @@ impl Header for Expect {
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl fmt::Display for Expect {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("100-continue") f.write_str("100-continue")
} }
} }

View File

@@ -85,9 +85,8 @@ macro_rules! bench_header(
fn bench_format(b: &mut Bencher) { fn bench_format(b: &mut Bencher) {
let raw = $value.into(); let raw = $value.into();
let val: $ty = Header::parse_header(&raw).unwrap(); let val: $ty = Header::parse_header(&raw).unwrap();
let fmt = ::header::HeaderFormatter(&val);
b.iter(|| { b.iter(|| {
format!("{}", fmt); format!("{}", val);
}); });
} }
} }

View File

@@ -59,7 +59,7 @@ impl Header for Origin {
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}://{}", self.scheme, self.host) fmt::Display::fmt(self, f)
} }
} }
@@ -83,6 +83,12 @@ impl FromStr for Origin {
} }
} }
impl fmt::Display for Origin {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}://{}", self.scheme, self.host)
}
}
impl PartialEq for Origin { impl PartialEq for Origin {
fn eq(&self, other: &Origin) -> bool { fn eq(&self, other: &Origin) -> bool {
self.scheme == other.scheme && self.host == other.host self.scheme == other.scheme && self.host == other.host

View File

@@ -55,6 +55,12 @@ impl Header for Pragma {
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl fmt::Display for Pragma {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(match *self { f.write_str(match *self {
Pragma::NoCache => "no-cache", Pragma::NoCache => "no-cache",
Pragma::Ext(ref string) => &string[..], Pragma::Ext(ref string) => &string[..],

View File

@@ -66,6 +66,12 @@ impl Header for Prefer {
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl fmt::Display for Prefer {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt_comma_delimited(f, &self[..]) fmt_comma_delimited(f, &self[..])
} }
} }

View File

@@ -64,6 +64,13 @@ impl Header for PreferenceApplied {
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl fmt::Display for PreferenceApplied {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
//TODO: format this without allocating a Vec and cloning contents
let preferences: Vec<_> = self.0.iter().map(|pref| match pref { let preferences: Vec<_> = self.0.iter().map(|pref| match pref {
// The spec ignores parameters in `Preferences-Applied` // The spec ignores parameters in `Preferences-Applied`
&Preference::Extension(ref name, ref value, _) => Preference::Extension( &Preference::Extension(ref name, ref value, _) => Preference::Extension(

View File

@@ -80,6 +80,12 @@ impl Header for ReferrerPolicy {
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl fmt::Display for ReferrerPolicy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::ReferrerPolicy::*; use self::ReferrerPolicy::*;
f.write_str(match *self { f.write_str(match *self {
NoReferrer => "no-referrer", NoReferrer => "no-referrer",

View File

@@ -130,6 +130,12 @@ impl Header for StrictTransportSecurity {
} }
fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f)
}
}
impl fmt::Display for StrictTransportSecurity {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.include_subdomains { if self.include_subdomains {
write!(f, "max-age={}; includeSubdomains", self.max_age) write!(f, "max-age={}; includeSubdomains", self.max_age)
} else { } else {