refactor(headers): Use header!() for CORS headers.
This is the last bunch of headers that should use the new macro. Moved them out of their own folder so that the macro works. Changed them, so that they are more in line with the other headers. BREAKING CHANGE: `AccessControlAllowHeaders` and `AccessControlRequestHeaders` values are case insensitive now. `AccessControlAllowOrigin` variants are now `Any` and `Value` to match the other headers.
This commit is contained in:
		| @@ -1,32 +0,0 @@ | ||||
| use std::fmt::{self}; | ||||
|  | ||||
| use header; | ||||
|  | ||||
| /// The `Access-Control-Allow-Headers` response header, | ||||
| /// part of [CORS](http://www.w3.org/TR/cors/). | ||||
| /// | ||||
| /// > The `Access-Control-Allow-Headers` header indicates, as part of the | ||||
| /// > response to a preflight request, which header field names can be used | ||||
| /// > during the actual request. | ||||
| /// | ||||
| /// Spec: www.w3.org/TR/cors/#access-control-allow-headers-response-header | ||||
| #[derive(Clone, PartialEq, Debug)] | ||||
| pub struct AccessControlAllowHeaders(pub Vec<String>); | ||||
|  | ||||
| impl header::Header for AccessControlAllowHeaders { | ||||
|     #[inline] | ||||
|     fn header_name() -> &'static str { | ||||
|         "Access-Control-Allow-Headers" | ||||
|     } | ||||
|  | ||||
|     fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlAllowHeaders> { | ||||
|         header::parsing::from_comma_delimited(raw).map(AccessControlAllowHeaders) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl header::HeaderFormat for AccessControlAllowHeaders { | ||||
|     fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         let AccessControlAllowHeaders(ref parts) = *self; | ||||
|         header::parsing::fmt_comma_delimited(f, parts.as_ref()) | ||||
|     } | ||||
| } | ||||
| @@ -1,33 +0,0 @@ | ||||
| use std::fmt::{self}; | ||||
|  | ||||
| use header; | ||||
| use method; | ||||
|  | ||||
| /// The `Access-Control-Allow-Methods` response header, | ||||
| /// part of [CORS](http://www.w3.org/TR/cors/). | ||||
| /// | ||||
| /// > The `Access-Control-Allow-Methods` header indicates, as part of the | ||||
| /// > response to a preflight request, which methods can be used during the | ||||
| /// > actual request. | ||||
| /// | ||||
| /// Spec: www.w3.org/TR/cors/#access-control-allow-methods-response-header | ||||
| #[derive(Clone, PartialEq, Debug)] | ||||
| pub struct AccessControlAllowMethods(pub Vec<method::Method>); | ||||
|  | ||||
| impl header::Header for AccessControlAllowMethods { | ||||
|     #[inline] | ||||
|     fn header_name() -> &'static str { | ||||
|         "Access-Control-Allow-Methods" | ||||
|     } | ||||
|  | ||||
|     fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlAllowMethods> { | ||||
|         header::parsing::from_comma_delimited(raw).map(AccessControlAllowMethods) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl header::HeaderFormat for AccessControlAllowMethods { | ||||
|     fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         let AccessControlAllowMethods(ref parts) = *self; | ||||
|         header::parsing::fmt_comma_delimited(f, parts.as_ref()) | ||||
|     } | ||||
| } | ||||
| @@ -1,31 +0,0 @@ | ||||
| use std::fmt; | ||||
|  | ||||
| use header; | ||||
|  | ||||
| /// The `Access-Control-Max-Age` response header, | ||||
| /// part of [CORS](http://www.w3.org/TR/cors/). | ||||
| /// | ||||
| /// > The `Access-Control-Max-Age` header indicates how long the results of a | ||||
| /// > preflight request can be cached in a preflight result cache. | ||||
| /// | ||||
| /// Spec: www.w3.org/TR/cors/#access-control-max-age-response-header | ||||
| #[derive(Clone, Copy, PartialEq, Debug)] | ||||
| pub struct AccessControlMaxAge(pub u32); | ||||
|  | ||||
| impl header::Header for AccessControlMaxAge { | ||||
|     #[inline] | ||||
|     fn header_name() -> &'static str { | ||||
|         "Access-Control-Max-Age" | ||||
|     } | ||||
|  | ||||
|     fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlMaxAge> { | ||||
|         header::parsing::from_one_raw_str(raw).map(AccessControlMaxAge) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl header::HeaderFormat for AccessControlMaxAge { | ||||
|     fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         let AccessControlMaxAge(ref num) = *self; | ||||
|         write!(f, "{}", num) | ||||
|     } | ||||
| } | ||||
| @@ -1,13 +0,0 @@ | ||||
| pub use self::allow_headers::AccessControlAllowHeaders; | ||||
| pub use self::allow_methods::AccessControlAllowMethods; | ||||
| pub use self::allow_origin::AccessControlAllowOrigin; | ||||
| pub use self::max_age::AccessControlMaxAge; | ||||
| pub use self::request_headers::AccessControlRequestHeaders; | ||||
| pub use self::request_method::AccessControlRequestMethod; | ||||
|  | ||||
| mod allow_headers; | ||||
| mod allow_methods; | ||||
| mod allow_origin; | ||||
| mod max_age; | ||||
| mod request_headers; | ||||
| mod request_method; | ||||
| @@ -1,31 +0,0 @@ | ||||
| use std::fmt::{self}; | ||||
|  | ||||
| use header; | ||||
|  | ||||
| /// The `Access-Control-Request-Headers` request header, | ||||
| /// part of [CORS](http://www.w3.org/TR/cors/). | ||||
| /// | ||||
| /// > The `Access-Control-Request-Headers` header indicates which headers will | ||||
| /// > be used in the actual request as part of the preflight request. | ||||
| /// | ||||
| /// Spec: www.w3.org/TR/cors/#access-control-request-headers-request-header | ||||
| #[derive(Clone, PartialEq, Debug)] | ||||
| pub struct AccessControlRequestHeaders(pub Vec<String>); | ||||
|  | ||||
| impl header::Header for AccessControlRequestHeaders { | ||||
|     #[inline] | ||||
|     fn header_name() -> &'static str { | ||||
|         "Access-Control-Request-Headers" | ||||
|     } | ||||
|  | ||||
|     fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlRequestHeaders> { | ||||
|         header::parsing::from_comma_delimited(raw).map(AccessControlRequestHeaders) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl header::HeaderFormat for AccessControlRequestHeaders { | ||||
|     fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         let AccessControlRequestHeaders(ref parts) = *self; | ||||
|         header::parsing::fmt_comma_delimited(f, parts.as_ref()) | ||||
|     } | ||||
| } | ||||
| @@ -1,32 +0,0 @@ | ||||
| use std::fmt; | ||||
|  | ||||
| use header; | ||||
| use method::Method; | ||||
|  | ||||
| /// The `Access-Control-Request-Method` request header, | ||||
| /// part of [CORS](http://www.w3.org/TR/cors/). | ||||
| /// | ||||
| /// > The `Access-Control-Request-Method` header indicates which method will be | ||||
| /// > used in the actual request as part of the preflight request. | ||||
| /// | ||||
| /// Spec: www.w3.org/TR/cors/#access-control-request-method-request-header | ||||
| #[derive(Clone, PartialEq, Debug)] | ||||
| pub struct AccessControlRequestMethod(pub Method); | ||||
|  | ||||
| impl header::Header for AccessControlRequestMethod { | ||||
|     #[inline] | ||||
|     fn header_name() -> &'static str { | ||||
|         "Access-Control-Request-Method" | ||||
|     } | ||||
|  | ||||
|     fn parse_header(raw: &[Vec<u8>]) -> Option<AccessControlRequestMethod> { | ||||
|         header::parsing::from_one_raw_str(raw).map(AccessControlRequestMethod) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl header::HeaderFormat for AccessControlRequestMethod { | ||||
|     fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         let AccessControlRequestMethod(ref method) = *self; | ||||
|         write!(f, "{}", method) | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								src/header/common/access_control_allow_headers.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/header/common/access_control_allow_headers.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| use unicase::UniCase; | ||||
|  | ||||
| header! { | ||||
|     #[doc="`Access-Control-Allow-Headers` header, part of"] | ||||
|     #[doc="[CORS](www.w3.org/TR/cors/#access-control-allow-headers-response-header)"] | ||||
|     #[doc=""] | ||||
|     #[doc="The `Access-Control-Allow-Headers` header indicates, as part of the"] | ||||
|     #[doc="response to a preflight request, which header field names can be used"] | ||||
|     #[doc="during the actual request."] | ||||
|     (AccessControlAllowHeaders, "Access-Control-Allow-Headers") => (UniCase<String>)* | ||||
| } | ||||
							
								
								
									
										11
									
								
								src/header/common/access_control_allow_methods.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/header/common/access_control_allow_methods.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| use method::Method; | ||||
|  | ||||
| header! { | ||||
|     #[doc="`Access-Control-Allow-Methods` header, part of"] | ||||
|     #[doc="[CORS](www.w3.org/TR/cors/#access-control-allow-methods-response-header)"] | ||||
|     #[doc=""] | ||||
|     #[doc="The `Access-Control-Allow-Methods` header indicates, as part of the"] | ||||
|     #[doc="response to a preflight request, which methods can be used during the"] | ||||
|     #[doc="actual request."] | ||||
|     (AccessControlAllowMethods, "Access-Control-Allow-Methods") => (Method)* | ||||
| } | ||||
| @@ -1,8 +1,7 @@ | ||||
| extern crate url; | ||||
| 
 | ||||
| use std::fmt::{self}; | ||||
| use std::str; | ||||
| 
 | ||||
| use url::Url; | ||||
| use header; | ||||
| 
 | ||||
| /// The `Access-Control-Allow-Origin` response header,
 | ||||
| @@ -16,13 +15,12 @@ use header; | ||||
| #[derive(Clone, PartialEq, Debug)] | ||||
| pub enum AccessControlAllowOrigin { | ||||
|     /// Allow all origins
 | ||||
|     AllowStar, | ||||
|     Any, | ||||
|     /// Allow one particular origin
 | ||||
|     AllowOrigin(url::Url), | ||||
|     Value(Url), | ||||
| } | ||||
| 
 | ||||
| impl header::Header for AccessControlAllowOrigin { | ||||
|     #[inline] | ||||
|     fn header_name() -> &'static str { | ||||
|         "Access-Control-Allow-Origin" | ||||
|     } | ||||
| @@ -32,10 +30,10 @@ impl header::Header for AccessControlAllowOrigin { | ||||
|             match str::from_utf8(unsafe { &raw.get_unchecked(0)[..] }) { | ||||
|                 Ok(s) => { | ||||
|                     if s == "*" { | ||||
|                         Some(AccessControlAllowOrigin::AllowStar) | ||||
|                         Some(AccessControlAllowOrigin::Any) | ||||
|                     } else { | ||||
|                         url::Url::parse(s).ok().map( | ||||
|                             |url| AccessControlAllowOrigin::AllowOrigin(url)) | ||||
|                         Url::parse(s).ok().map( | ||||
|                             |url| AccessControlAllowOrigin::Value(url)) | ||||
|                     } | ||||
|                 }, | ||||
|                 _ => return None, | ||||
| @@ -49,8 +47,8 @@ impl header::Header for AccessControlAllowOrigin { | ||||
| impl header::HeaderFormat for AccessControlAllowOrigin { | ||||
|     fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         match *self { | ||||
|             AccessControlAllowOrigin::AllowStar => write!(f, "*"), | ||||
|             AccessControlAllowOrigin::AllowOrigin(ref url) => | ||||
|             AccessControlAllowOrigin::Any => write!(f, "*"), | ||||
|             AccessControlAllowOrigin::Value(ref url) => | ||||
|                 write!(f, "{}", url) | ||||
|         } | ||||
|     } | ||||
							
								
								
									
										8
									
								
								src/header/common/access_control_max_age.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/header/common/access_control_max_age.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| header! { | ||||
|     #[doc="`Access-Control-Max-Age` header, part of"] | ||||
|     #[doc="[CORS](www.w3.org/TR/cors/#access-control-max-age-response-header)"] | ||||
|     #[doc=""] | ||||
|     #[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] | ||||
| } | ||||
							
								
								
									
										11
									
								
								src/header/common/access_control_request_headers.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/header/common/access_control_request_headers.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| use unicase::UniCase; | ||||
|  | ||||
| header! { | ||||
|     #[doc="`Access-Control-Request-Headers` header, part of"] | ||||
|     #[doc="[CORS](www.w3.org/TR/cors/#access-control-request-headers-request-header)"] | ||||
|     #[doc=""] | ||||
|     #[doc="The `Access-Control-Request-Headers` header indicates which headers will"] | ||||
|     #[doc="be used in the actual request as part of the preflight request."] | ||||
|     #[doc="during the actual request."] | ||||
|     (AccessControlRequestHeaders, "Access-Control-Request-Headers") => (UniCase<String>)* | ||||
| } | ||||
							
								
								
									
										10
									
								
								src/header/common/access_control_request_method.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/header/common/access_control_request_method.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| use method::Method; | ||||
|  | ||||
| header! { | ||||
|     #[doc="`Access-Control-Request-Method` header, part of"] | ||||
|     #[doc="[CORS](www.w3.org/TR/cors/#access-control-request-method-request-header)"] | ||||
|     #[doc=""] | ||||
|     #[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] | ||||
| } | ||||
| @@ -6,8 +6,13 @@ | ||||
| //! strongly-typed theme, the [mime](http://seanmonstar.github.io/mime.rs) crate | ||||
| //! is used, such as `ContentType(pub Mime)`. | ||||
|  | ||||
| pub use self::access_control::*; | ||||
| pub use self::accept::Accept; | ||||
| pub use self::access_control_allow_headers::AccessControlAllowHeaders; | ||||
| pub use self::access_control_allow_methods::AccessControlAllowMethods; | ||||
| pub use self::access_control_allow_origin::AccessControlAllowOrigin; | ||||
| pub use self::access_control_max_age::AccessControlMaxAge; | ||||
| pub use self::access_control_request_headers::AccessControlRequestHeaders; | ||||
| pub use self::access_control_request_method::AccessControlRequestMethod; | ||||
| pub use self::accept_charset::AcceptCharset; | ||||
| pub use self::accept_encoding::AcceptEncoding; | ||||
| pub use self::accept_language::AcceptLanguage; | ||||
| @@ -216,8 +221,13 @@ macro_rules! header { | ||||
|     }; | ||||
| } | ||||
|  | ||||
| mod access_control; | ||||
| mod accept; | ||||
| mod access_control_allow_headers; | ||||
| mod access_control_allow_methods; | ||||
| mod access_control_allow_origin; | ||||
| mod access_control_max_age; | ||||
| mod access_control_request_headers; | ||||
| mod access_control_request_method; | ||||
| mod accept_charset; | ||||
| mod accept_encoding; | ||||
| mod accept_language; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user