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 ]
33
21
}
34
22
35
23
#[ cfg( test) ]
36
24
mod tests {
37
- use super :: Etag ;
25
+ use super :: ETag ;
38
26
use header:: { Header , EntityTag } ;
39
27
40
28
#[ test]
41
29
fn test_etag_successes ( ) {
42
30
// Expected successes
43
- let mut etag: Option < Etag > ;
31
+ let mut etag: Option < ETag > ;
44
32
45
33
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( ) ) ) ) ) ;
47
35
48
36
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( ) ) ) ) ) ;
50
38
51
39
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( ) ) ) ) ) ;
53
41
54
42
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( ) ) ) ) ) ;
56
44
57
45
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( ) ) ) ) ) ;
59
47
}
60
48
61
49
#[ test]
62
50
fn test_etag_failures ( ) {
63
51
// Expected failures
64
- let mut etag: Option < Etag > ;
52
+ let mut etag: Option < ETag > ;
65
53
66
54
etag = Header :: parse_header ( [ b"no-dquotes" . to_vec ( ) ] . as_ref ( ) ) ;
67
55
assert_eq ! ( etag, None ) ;
@@ -83,4 +71,4 @@ mod tests {
83
71
}
84
72
}
85
73
86
- bench_header ! ( bench, Etag , { vec![ b"W/\" nonemptytag\" " . to_vec( ) ] } ) ;
74
+ bench_header ! ( bench, ETag , { vec![ b"W/\" nonemptytag\" " . to_vec( ) ] } ) ;
0 commit comments