From ed458628e54bd241b45f50fb0cf55a84ffb12205 Mon Sep 17 00:00:00 2001 From: Pyfisch Date: Sat, 4 Jul 2015 17:20:41 +0200 Subject: [PATCH] refactor(headers): use String in Access-Control-Allow-Origin header Access-Control-Allow-Origin origins are URLs but they do not need to be valid, they should just be compared as strings. So to support invalid URLs hyper should use a string instead. closes #526 BREAKING CHANGE: Access-Control-Allow-Origin does no longer use Url --- src/error.rs | 7 ++++++ .../common/access_control_allow_origin.rs | 25 +++++++++---------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/error.rs b/src/error.rs index 2f8a73be..100e870b 100644 --- a/src/error.rs +++ b/src/error.rs @@ -3,6 +3,7 @@ use std::error::Error as StdError; use std::fmt; use std::io::Error as IoError; use std::str::Utf8Error; +use std::string::FromUtf8Error; use httparse; use url; @@ -127,6 +128,12 @@ impl From for Error { } } +impl From for Error { + fn from(err: FromUtf8Error) -> Error { + Utf8(err.utf8_error()) + } +} + impl From for Error { fn from(err: httparse::Error) -> Error { match err { diff --git a/src/header/common/access_control_allow_origin.rs b/src/header/common/access_control_allow_origin.rs index 2441aeb5..306966e8 100644 --- a/src/header/common/access_control_allow_origin.rs +++ b/src/header/common/access_control_allow_origin.rs @@ -1,7 +1,5 @@ use std::fmt::{self, Display}; -use std::str; -use url::Url; use header::{Header, HeaderFormat}; /// The `Access-Control-Allow-Origin` response header, @@ -20,7 +18,7 @@ use header::{Header, HeaderFormat}; /// * `null` /// * `*` /// * `http://google.com/` -/// +/// /// # Examples /// ``` /// use hyper::header::{Headers, AccessControlAllowOrigin}; @@ -40,11 +38,10 @@ use header::{Header, HeaderFormat}; /// ``` /// ``` /// use hyper::header::{Headers, AccessControlAllowOrigin}; -/// use hyper::Url; /// /// let mut headers = Headers::new(); /// headers.set( -/// AccessControlAllowOrigin::Value(Url::parse("http://hyper.rs").unwrap()) +/// AccessControlAllowOrigin::Value("http://hyper.rs".to_owned()) /// ); /// ``` #[derive(Clone, PartialEq, Debug)] @@ -54,7 +51,7 @@ pub enum AccessControlAllowOrigin { /// A hidden origin Null, /// Allow one particular origin - Value(Url), + Value(String), } impl Header for AccessControlAllowOrigin { @@ -63,13 +60,15 @@ impl Header for AccessControlAllowOrigin { } fn parse_header(raw: &[Vec]) -> ::Result { - if raw.len() == 1 { - match unsafe { &raw.get_unchecked(0)[..] } { - b"*" => Ok(AccessControlAllowOrigin::Any), - b"null" => Ok(AccessControlAllowOrigin::Null), - r => Ok(AccessControlAllowOrigin::Value(try!(Url::parse(try!(str::from_utf8(r)))))) - } - } else { Err(::Error::Header) } + if raw.len() != 1 { + return Err(::Error::Header) + } + let value = unsafe { raw.get_unchecked(0) }; + Ok(match &value[..] { + b"*" => AccessControlAllowOrigin::Any, + b"null" => AccessControlAllowOrigin::Null, + _ => AccessControlAllowOrigin::Value(try!(String::from_utf8(value.clone()))) + }) } }