Skip to content

Commit 4434ea6

Browse files
committed
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
1 parent 8f1c829 commit 4434ea6

File tree

2 files changed

+30
-42
lines changed

2 files changed

+30
-42
lines changed

src/header/common/etag.rs

+29-41
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,55 @@
1-
use header::{EntityTag, Header, HeaderFormat};
2-
use std::fmt::{self, Display};
3-
use header::parsing::from_one_raw_str;
4-
5-
/// The `Etag` header.
6-
///
7-
/// An Etag consists of a string enclosed by two literal double quotes.
8-
/// Preceding the first double quote is an optional weakness indicator,
9-
/// which always looks like this: W/
10-
/// See also: https://tools.ietf.org/html/rfc7232#section-2.3
11-
#[derive(Clone, PartialEq, Debug)]
12-
pub struct Etag(pub EntityTag);
13-
14-
deref!(Etag => EntityTag);
15-
16-
impl Header for Etag {
17-
fn header_name() -> &'static str {
18-
"Etag"
19-
}
20-
21-
fn parse_header(raw: &[Vec<u8>]) -> Option<Etag> {
22-
23-
from_one_raw_str(raw).and_then(|s: String| {
24-
s.parse::<EntityTag>().and_then(|x| Ok(Etag(x))).ok()
25-
})
26-
}
27-
}
28-
29-
impl HeaderFormat for Etag {
30-
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
31-
self.0.fmt(fmt)
32-
}
1+
use header::EntityTag;
2+
3+
header! {
4+
#[doc="`ETag` header, defined in [RFC7232](http://tools.ietf.org/html/rfc7232#section-2.3)"]
5+
#[doc=""]
6+
#[doc="The `ETag` header field in a response provides the current entity-tag"]
7+
#[doc="for the selected representation, as determined at the conclusion of"]
8+
#[doc="handling the request. An entity-tag is an opaque validator for"]
9+
#[doc="differentiating between multiple representations of the same"]
10+
#[doc="resource, regardless of whether those multiple representations are"]
11+
#[doc="due to resource state changes over time, content negotiation"]
12+
#[doc="resulting in multiple representations being valid at the same time,"]
13+
#[doc="or both. An entity-tag consists of an opaque quoted string, possibly"]
14+
#[doc="prefixed by a weakness indicator."]
15+
#[doc=""]
16+
#[doc="# ABNF"]
17+
#[doc="```plain"]
18+
#[doc="ETag = entity-tag"]
19+
#[doc="```"]
20+
(ETag, "ETag") => [EntityTag]
3321
}
3422

3523
#[cfg(test)]
3624
mod tests {
37-
use super::Etag;
25+
use super::ETag;
3826
use header::{Header,EntityTag};
3927

4028
#[test]
4129
fn test_etag_successes() {
4230
// Expected successes
43-
let mut etag: Option<Etag>;
31+
let mut etag: Option<ETag>;
4432

4533
etag = Header::parse_header([b"\"foobar\"".to_vec()].as_ref());
46-
assert_eq!(etag, Some(Etag(EntityTag::new(false, "foobar".to_string()))));
34+
assert_eq!(etag, Some(ETag(EntityTag::new(false, "foobar".to_string()))));
4735

4836
etag = Header::parse_header([b"\"\"".to_vec()].as_ref());
49-
assert_eq!(etag, Some(Etag(EntityTag::new(false, "".to_string()))));
37+
assert_eq!(etag, Some(ETag(EntityTag::new(false, "".to_string()))));
5038

5139
etag = Header::parse_header([b"W/\"weak-etag\"".to_vec()].as_ref());
52-
assert_eq!(etag, Some(Etag(EntityTag::new(true, "weak-etag".to_string()))));
40+
assert_eq!(etag, Some(ETag(EntityTag::new(true, "weak-etag".to_string()))));
5341

5442
etag = Header::parse_header([b"W/\"\x65\x62\"".to_vec()].as_ref());
55-
assert_eq!(etag, Some(Etag(EntityTag::new(true, "\u{0065}\u{0062}".to_string()))));
43+
assert_eq!(etag, Some(ETag(EntityTag::new(true, "\u{0065}\u{0062}".to_string()))));
5644

5745
etag = Header::parse_header([b"W/\"\"".to_vec()].as_ref());
58-
assert_eq!(etag, Some(Etag(EntityTag::new(true, "".to_string()))));
46+
assert_eq!(etag, Some(ETag(EntityTag::new(true, "".to_string()))));
5947
}
6048

6149
#[test]
6250
fn test_etag_failures() {
6351
// Expected failures
64-
let mut etag: Option<Etag>;
52+
let mut etag: Option<ETag>;
6553

6654
etag = Header::parse_header([b"no-dquotes".to_vec()].as_ref());
6755
assert_eq!(etag, None);
@@ -83,4 +71,4 @@ mod tests {
8371
}
8472
}
8573

86-
bench_header!(bench, Etag, { vec![b"W/\"nonemptytag\"".to_vec()] });
74+
bench_header!(bench, ETag, { vec![b"W/\"nonemptytag\"".to_vec()] });

src/header/common/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub use self::content_encoding::ContentEncoding;
2020
pub use self::content_type::ContentType;
2121
pub use self::cookie::Cookie;
2222
pub use self::date::Date;
23-
pub use self::etag::Etag;
23+
pub use self::etag::ETag;
2424
pub use self::expect::Expect;
2525
pub use self::expires::Expires;
2626
pub use self::host::Host;

0 commit comments

Comments
 (0)