1+ use header:: { Header , HeaderFormat } ;
2+ use method:: Method ;
3+ use std:: fmt:: { mod} ;
4+ use super :: util:: { from_comma_delimited, fmt_comma_delimited} ;
5+
6+ /// The `Allow` header.
7+ /// See also https://tools.ietf.org/html/rfc7231#section-7.4.1
8+
9+ #[ deriving( Clone , PartialEq , Show ) ]
10+ pub struct Allow ( pub Vec < Method > ) ;
11+
12+ deref ! ( Allow -> Vec <Method >)
13+
14+ impl Header for Allow {
15+ fn header_name ( _: Option < Allow > ) -> & ' static str {
16+ "Allow"
17+ }
18+
19+ fn parse_header ( raw : & [ Vec < u8 > ] ) -> Option < Allow > {
20+ from_comma_delimited ( raw) . map ( |vec| Allow ( vec) )
21+ }
22+ }
23+
24+ impl HeaderFormat for Allow {
25+ fn fmt_header ( & self , fmt : & mut fmt:: Formatter ) -> fmt:: Result {
26+ fmt_comma_delimited ( fmt, self [ ] )
27+ }
28+ }
29+
30+ #[ cfg( test) ]
31+ mod tests {
32+ use super :: Allow ;
33+ use header:: Header ;
34+ use method:: Method :: { mod, Options , Get , Put , Post , Delete , Head , Trace , Connect , Patch , Extension } ;
35+
36+ #[ test]
37+ fn test_allow ( ) {
38+ let mut allow: Option < Allow > ;
39+
40+ allow = Header :: parse_header ( [ b"OPTIONS,GET,PUT,POST,DELETE,HEAD,TRACE,CONNECT,PATCH,fOObAr" . to_vec ( ) ] . as_slice ( ) ) ;
41+ assert_eq ! ( allow, Some ( Allow ( vec![ Options , Get , Put , Post , Delete , Head , Trace , Connect , Patch , Extension ( "fOObAr" . to_string( ) ) ] ) ) ) ;
42+
43+ allow = Header :: parse_header ( [ b"" . to_vec ( ) ] . as_slice ( ) ) ;
44+ assert_eq ! ( allow, Some ( Allow ( Vec :: <Method >:: new( ) ) ) ) ;
45+ }
46+ }
47+
48+ bench_header ! ( bench, Allow , { vec![ b"OPTIONS,GET,PUT,POST,DELETE,HEAD,TRACE,CONNECT,PATCH,fOObAr" . to_vec( ) ] } )
0 commit comments