requiem_http/header/common/etag.rs
1use crate::header::{EntityTag, ETAG};
2
3header! {
4 /// `ETag` header, defined in [RFC7232](http://tools.ietf.org/html/rfc7232#section-2.3)
5 ///
6 /// The `ETag` header field in a response provides the current entity-tag
7 /// for the selected representation, as determined at the conclusion of
8 /// handling the request. An entity-tag is an opaque validator for
9 /// differentiating between multiple representations of the same
10 /// resource, regardless of whether those multiple representations are
11 /// due to resource state changes over time, content negotiation
12 /// resulting in multiple representations being valid at the same time,
13 /// or both. An entity-tag consists of an opaque quoted string, possibly
14 /// prefixed by a weakness indicator.
15 ///
16 /// # ABNF
17 ///
18 /// ```text
19 /// ETag = entity-tag
20 /// ```
21 ///
22 /// # Example values
23 ///
24 /// * `"xyzzy"`
25 /// * `W/"xyzzy"`
26 /// * `""`
27 ///
28 /// # Examples
29 ///
30 /// ```rust
31 /// use requiem_http::Response;
32 /// use requiem_http::http::header::{ETag, EntityTag};
33 ///
34 /// let mut builder = Response::Ok();
35 /// builder.set(ETag(EntityTag::new(false, "xyzzy".to_owned())));
36 /// ```
37 ///
38 /// ```rust
39 /// use requiem_http::Response;
40 /// use requiem_http::http::header::{ETag, EntityTag};
41 ///
42 /// let mut builder = Response::Ok();
43 /// builder.set(ETag(EntityTag::new(true, "xyzzy".to_owned())));
44 /// ```
45 (ETag, ETAG) => [EntityTag]
46
47 test_etag {
48 // From the RFC
49 test_header!(test1,
50 vec![b"\"xyzzy\""],
51 Some(ETag(EntityTag::new(false, "xyzzy".to_owned()))));
52 test_header!(test2,
53 vec![b"W/\"xyzzy\""],
54 Some(ETag(EntityTag::new(true, "xyzzy".to_owned()))));
55 test_header!(test3,
56 vec![b"\"\""],
57 Some(ETag(EntityTag::new(false, "".to_owned()))));
58 // Own tests
59 test_header!(test4,
60 vec![b"\"foobar\""],
61 Some(ETag(EntityTag::new(false, "foobar".to_owned()))));
62 test_header!(test5,
63 vec![b"\"\""],
64 Some(ETag(EntityTag::new(false, "".to_owned()))));
65 test_header!(test6,
66 vec![b"W/\"weak-etag\""],
67 Some(ETag(EntityTag::new(true, "weak-etag".to_owned()))));
68 test_header!(test7,
69 vec![b"W/\"\x65\x62\""],
70 Some(ETag(EntityTag::new(true, "\u{0065}\u{0062}".to_owned()))));
71 test_header!(test8,
72 vec![b"W/\"\""],
73 Some(ETag(EntityTag::new(true, "".to_owned()))));
74 test_header!(test9,
75 vec![b"no-dquotes"],
76 None::<ETag>);
77 test_header!(test10,
78 vec![b"w/\"the-first-w-is-case-sensitive\""],
79 None::<ETag>);
80 test_header!(test11,
81 vec![b""],
82 None::<ETag>);
83 test_header!(test12,
84 vec![b"\"unmatched-dquotes1"],
85 None::<ETag>);
86 test_header!(test13,
87 vec![b"unmatched-dquotes2\""],
88 None::<ETag>);
89 test_header!(test14,
90 vec![b"matched-\"dquotes\""],
91 None::<ETag>);
92 test_header!(test15,
93 vec![b"\""],
94 None::<ETag>);
95 }
96}