refactor(headers): Use header!() macro for ETag header

Change `Etag` (only the `E` is capitalized) to `ETag` as it is written
in the relevant RFC.

BREAKING CHANGE: `Etag` header field is now `ETag` header field
This commit is contained in:
Pyfisch
2015-04-02 12:56:06 +02:00
parent 8f1c82901e
commit 4434ea6a7d
2 changed files with 29 additions and 41 deletions

View File

@@ -1,67 +1,55 @@
use header::{EntityTag, Header, HeaderFormat}; use header::EntityTag;
use std::fmt::{self, Display};
use header::parsing::from_one_raw_str;
/// The `Etag` header. header! {
/// #[doc="`ETag` header, defined in [RFC7232](http://tools.ietf.org/html/rfc7232#section-2.3)"]
/// An Etag consists of a string enclosed by two literal double quotes. #[doc=""]
/// Preceding the first double quote is an optional weakness indicator, #[doc="The `ETag` header field in a response provides the current entity-tag"]
/// which always looks like this: W/ #[doc="for the selected representation, as determined at the conclusion of"]
/// See also: https://tools.ietf.org/html/rfc7232#section-2.3 #[doc="handling the request. An entity-tag is an opaque validator for"]
#[derive(Clone, PartialEq, Debug)] #[doc="differentiating between multiple representations of the same"]
pub struct Etag(pub EntityTag); #[doc="resource, regardless of whether those multiple representations are"]
#[doc="due to resource state changes over time, content negotiation"]
deref!(Etag => EntityTag); #[doc="resulting in multiple representations being valid at the same time,"]
#[doc="or both. An entity-tag consists of an opaque quoted string, possibly"]
impl Header for Etag { #[doc="prefixed by a weakness indicator."]
fn header_name() -> &'static str { #[doc=""]
"Etag" #[doc="# ABNF"]
} #[doc="```plain"]
#[doc="ETag = entity-tag"]
fn parse_header(raw: &[Vec<u8>]) -> Option<Etag> { #[doc="```"]
(ETag, "ETag") => [EntityTag]
from_one_raw_str(raw).and_then(|s: String| {
s.parse::<EntityTag>().and_then(|x| Ok(Etag(x))).ok()
})
}
}
impl HeaderFormat for Etag {
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
self.0.fmt(fmt)
}
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::Etag; use super::ETag;
use header::{Header,EntityTag}; use header::{Header,EntityTag};
#[test] #[test]
fn test_etag_successes() { fn test_etag_successes() {
// Expected successes // Expected successes
let mut etag: Option<Etag>; let mut etag: Option<ETag>;
etag = Header::parse_header([b"\"foobar\"".to_vec()].as_ref()); etag = Header::parse_header([b"\"foobar\"".to_vec()].as_ref());
assert_eq!(etag, Some(Etag(EntityTag::new(false, "foobar".to_string())))); assert_eq!(etag, Some(ETag(EntityTag::new(false, "foobar".to_string()))));
etag = Header::parse_header([b"\"\"".to_vec()].as_ref()); etag = Header::parse_header([b"\"\"".to_vec()].as_ref());
assert_eq!(etag, Some(Etag(EntityTag::new(false, "".to_string())))); assert_eq!(etag, Some(ETag(EntityTag::new(false, "".to_string()))));
etag = Header::parse_header([b"W/\"weak-etag\"".to_vec()].as_ref()); etag = Header::parse_header([b"W/\"weak-etag\"".to_vec()].as_ref());
assert_eq!(etag, Some(Etag(EntityTag::new(true, "weak-etag".to_string())))); assert_eq!(etag, Some(ETag(EntityTag::new(true, "weak-etag".to_string()))));
etag = Header::parse_header([b"W/\"\x65\x62\"".to_vec()].as_ref()); etag = Header::parse_header([b"W/\"\x65\x62\"".to_vec()].as_ref());
assert_eq!(etag, Some(Etag(EntityTag::new(true, "\u{0065}\u{0062}".to_string())))); assert_eq!(etag, Some(ETag(EntityTag::new(true, "\u{0065}\u{0062}".to_string()))));
etag = Header::parse_header([b"W/\"\"".to_vec()].as_ref()); etag = Header::parse_header([b"W/\"\"".to_vec()].as_ref());
assert_eq!(etag, Some(Etag(EntityTag::new(true, "".to_string())))); assert_eq!(etag, Some(ETag(EntityTag::new(true, "".to_string()))));
} }
#[test] #[test]
fn test_etag_failures() { fn test_etag_failures() {
// Expected failures // Expected failures
let mut etag: Option<Etag>; let mut etag: Option<ETag>;
etag = Header::parse_header([b"no-dquotes".to_vec()].as_ref()); etag = Header::parse_header([b"no-dquotes".to_vec()].as_ref());
assert_eq!(etag, None); assert_eq!(etag, None);
@@ -83,4 +71,4 @@ mod tests {
} }
} }
bench_header!(bench, Etag, { vec![b"W/\"nonemptytag\"".to_vec()] }); bench_header!(bench, ETag, { vec![b"W/\"nonemptytag\"".to_vec()] });

View File

@@ -20,7 +20,7 @@ pub use self::content_encoding::ContentEncoding;
pub use self::content_type::ContentType; pub use self::content_type::ContentType;
pub use self::cookie::Cookie; pub use self::cookie::Cookie;
pub use self::date::Date; pub use self::date::Date;
pub use self::etag::Etag; pub use self::etag::ETag;
pub use self::expect::Expect; pub use self::expect::Expect;
pub use self::expires::Expires; pub use self::expires::Expires;
pub use self::host::Host; pub use self::host::Host;