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}