diff --git a/src/header/common/accept_charset.rs b/src/header/common/accept_charset.rs index 53ae264c05..1fc044ae3a 100644 --- a/src/header/common/accept_charset.rs +++ b/src/header/common/accept_charset.rs @@ -21,17 +21,3 @@ header! { test_header!(test1, vec![b"iso-8859-5, unicode-1-1;q=0.8"]); } } - - -#[test] -fn test_parse_header() { - use header::{self, q}; - let a: AcceptCharset = header::Header::parse_header( - [b"iso-8859-5, iso-8859-6;q=0.8".to_vec()].as_ref()).unwrap(); - let b = AcceptCharset(vec![ - QualityItem { item: Charset::Iso_8859_5, quality: q(1.0) }, - QualityItem { item: Charset::Iso_8859_6, quality: q(0.8) }, - ]); - assert_eq!(format!("{}", a), format!("{}", b)); - assert_eq!(a, b); -} diff --git a/src/header/common/access_control_max_age.rs b/src/header/common/access_control_max_age.rs index b5a9aec235..036f14e177 100644 --- a/src/header/common/access_control_max_age.rs +++ b/src/header/common/access_control_max_age.rs @@ -5,4 +5,6 @@ header! { #[doc="The `Access-Control-Max-Age` header indicates how long the results of a"] #[doc="preflight request can be cached in a preflight result cache."] (AccessControlMaxAge, "Access-Control-Max-Age") => [u32] -} \ No newline at end of file + + test_access_control_max_age {} +} diff --git a/src/header/common/access_control_request_method.rs b/src/header/common/access_control_request_method.rs index de97ec18f6..30f0c152b4 100644 --- a/src/header/common/access_control_request_method.rs +++ b/src/header/common/access_control_request_method.rs @@ -7,4 +7,6 @@ header! { #[doc="The `Access-Control-Request-Method` header indicates which method will be"] #[doc="used in the actual request as part of the preflight request."] (AccessControlRequestMethod, "Access-Control-Request-Method") => [Method] + + test_access_control_request_method {} } diff --git a/src/header/common/content_length.rs b/src/header/common/content_length.rs index ac6308809e..4c9d39463a 100644 --- a/src/header/common/content_length.rs +++ b/src/header/common/content_length.rs @@ -16,6 +16,11 @@ header! { #[doc="Content-Length = 1*DIGIT"] #[doc="```"] (ContentLength, "Content-Length") => [u64] + + test_content_length { + // Testcase from RFC + test_header!(test1, vec![b"3495"], Some(HeaderField(3495))); + } } bench_header!(bench, ContentLength, { vec![b"42349984".to_vec()] }); diff --git a/src/header/common/content_type.rs b/src/header/common/content_type.rs index 427de5eef8..89f4bff38d 100644 --- a/src/header/common/content_type.rs +++ b/src/header/common/content_type.rs @@ -17,6 +17,15 @@ header! { #[doc="Content-Type = media-type"] #[doc="```"] (ContentType, "Content-Type") => [Mime] + + test_content_type { + test_header!( + test1, + // FIXME: Should be b"text/html; charset=ISO-8859-4" but mime crate lowercases + // the whole value so parsing and formatting the value gives a different result + vec![b"text/html; charset=iso-8859-4"], + Some(HeaderField(Mime(TopLevel::Text, SubLevel::Html, vec![(Attr::Charset, Value::Ext("iso-8859-4".to_string()))])))); + } } bench_header!(bench, ContentType, { vec![b"application/json; charset=utf-8".to_vec()] }); diff --git a/src/header/common/date.rs b/src/header/common/date.rs index 70fcb5fed5..8bba67693d 100644 --- a/src/header/common/date.rs +++ b/src/header/common/date.rs @@ -11,6 +11,10 @@ header! { #[doc="Date = HTTP-date"] #[doc="```"] (Date, "Date") => [HttpDate] + + test_date { + test_header!(test1, vec![b"Tue, 15 Nov 1994 08:12:31 GMT"]); + } } bench_header!(imf_fixdate, Date, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/etag.rs b/src/header/common/etag.rs index 7d30041fb3..fbd65e2924 100644 --- a/src/header/common/etag.rs +++ b/src/header/common/etag.rs @@ -18,6 +18,12 @@ header! { #[doc="ETag = entity-tag"] #[doc="```"] (ETag, "ETag") => [EntityTag] + + test_etag { + test_header!(test1, vec![b"\"xyzzy\""], Some(HeaderField(EntityTag::new(false, "xyzzy".to_string())))); + test_header!(test2, vec![b"W/\"xyzzy\""], Some(HeaderField(EntityTag::new(true, "xyzzy".to_string())))); + test_header!(test3, vec![b"\"\""], Some(HeaderField(EntityTag::new(false, "".to_string())))); + } } #[cfg(test)] diff --git a/src/header/common/expires.rs b/src/header/common/expires.rs index 613ef6a0e0..aa080d5eb9 100644 --- a/src/header/common/expires.rs +++ b/src/header/common/expires.rs @@ -15,6 +15,11 @@ header! { #[doc="Expires = HTTP-date"] #[doc="```"] (Expires, "Expires") => [HttpDate] + + test_expires { + // Testcase from RFC + test_header!(test1, vec![b"Thu, 01 Dec 1994 16:00:00 GMT"]); + } } bench_header!(imf_fixdate, Expires, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/if_modified_since.rs b/src/header/common/if_modified_since.rs index b845320393..67241b845f 100644 --- a/src/header/common/if_modified_since.rs +++ b/src/header/common/if_modified_since.rs @@ -15,6 +15,11 @@ header! { #[doc="If-Unmodified-Since = HTTP-date"] #[doc="```"] (IfModifiedSince, "If-Modified-Since") => [HttpDate] + + test_if_modified_since { + // Testcase from RFC + test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]); + } } bench_header!(imf_fixdate, IfModifiedSince, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/if_unmodified_since.rs b/src/header/common/if_unmodified_since.rs index 200d030d5a..9fd3afbd6e 100644 --- a/src/header/common/if_unmodified_since.rs +++ b/src/header/common/if_unmodified_since.rs @@ -15,6 +15,11 @@ header! { #[doc="If-Unmodified-Since = HTTP-date"] #[doc="```"] (IfUnmodifiedSince, "If-Unmodified-Since") => [HttpDate] + + test_if_unmodified_since { + // Testcase from RFC + test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]); + } } bench_header!(imf_fixdate, IfUnmodifiedSince, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/last_modified.rs b/src/header/common/last_modified.rs index cf3f0cf564..e203b20b15 100644 --- a/src/header/common/last_modified.rs +++ b/src/header/common/last_modified.rs @@ -13,6 +13,10 @@ header! { #[doc="Expires = HTTP-date"] #[doc="```"] (LastModified, "Last-Modified") => [HttpDate] + + test_last_modified { + // Testcase from RFC + test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]);} } bench_header!(imf_fixdate, LastModified, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/location.rs b/src/header/common/location.rs index f5d23023f0..4ff45fdf3f 100644 --- a/src/header/common/location.rs +++ b/src/header/common/location.rs @@ -14,6 +14,12 @@ header! { // TODO: Use URL (Location, "Location") => [String] + test_location { + // Testcase from RFC + test_header!(test1, vec![b"/People.html#tim"]); + test_header!(test2, vec![b"http://www.example.net/index.html"]); + } + } bench_header!(bench, Location, { vec![b"http://foo.com/hello:3000".to_vec()] }); diff --git a/src/header/common/mod.rs b/src/header/common/mod.rs index b69e54e7c6..f1218f43a8 100644 --- a/src/header/common/mod.rs +++ b/src/header/common/mod.rs @@ -202,7 +202,7 @@ macro_rules! header { } }; // Single value header - ($(#[$a:meta])*($id:ident, $n:expr) => [$value:ty]) => { + ($(#[$a:meta])*($id:ident, $n:expr) => [$value:ty] $tm:ident{$($tf:item)*}) => { $(#[$a])* #[derive(Clone, Debug, PartialEq)] pub struct $id(pub $value); @@ -225,6 +225,15 @@ macro_rules! header { ::std::fmt::Display::fmt(&**self, f) } } + #[allow(unused_imports)] + mod $tm{ + use std::str; + use $crate::header::*; + use $crate::mime::*; + use $crate::method::Method; + use super::$id as HeaderField; + $($tf)* + } }; // List header, one or more items with "*" option ($(#[$a:meta])*($id:ident, $n:expr) => {Any / ($item:ty)+} $tm:ident{$($tf:item)*}) => { diff --git a/src/header/common/referer.rs b/src/header/common/referer.rs index ab720537ea..06dbeeff2f 100644 --- a/src/header/common/referer.rs +++ b/src/header/common/referer.rs @@ -14,6 +14,11 @@ header! { #[doc="```"] // TODO: Use URL (Referer, "Referer") => [String] + + test_referer { + // Testcase from the RFC + test_header!(test1, vec![b"http://www.example.org/hypertext/Overview.html"]); + } } bench_header!(bench, Referer, { vec![b"http://foo.com/hello:3000".to_vec()] }); diff --git a/src/header/common/server.rs b/src/header/common/server.rs index 476d4bc083..9f795c680c 100644 --- a/src/header/common/server.rs +++ b/src/header/common/server.rs @@ -15,6 +15,11 @@ header! { #[doc="```"] // TODO: Maybe parse as defined in the spec? (Server, "Server") => [String] + + test_server { + // Testcase from RFC + test_header!(test1, vec![b"CERN/3.0 libwww/2.17"]); + } } bench_header!(bench, Server, { vec![b"Some String".to_vec()] }); diff --git a/src/header/common/user_agent.rs b/src/header/common/user_agent.rs index 2a481e9bab..2592bcdabb 100644 --- a/src/header/common/user_agent.rs +++ b/src/header/common/user_agent.rs @@ -18,6 +18,11 @@ header! { #[doc="```"] // TODO: Maybe write parsing according to the spec? (Split the String) (UserAgent, "User-Agent") => [String] + + test_user_agent { + // Testcase from RFC + test_header!(test1, vec![b"CERN-LineMode/2.15 libwww/2.17b3"]); + } } #[test] fn test_format() {