add + 'static bounds to Header trait
This commit is contained in:
		| @@ -27,8 +27,11 @@ use rfc7230::read_header; | ||||
| use {HttpResult}; | ||||
|  | ||||
| /// A trait for any object that will represent a header field and value. | ||||
| pub trait Header: Any { | ||||
| pub trait Header: Any + 'static { | ||||
|     /// Returns the name of the header field this belongs to. | ||||
|     /// | ||||
|     /// The market `Option` is to hint to the type system which implementation | ||||
|     /// to call. This can be done away with once UFCS arrives. | ||||
|     fn header_name(marker: Option<Self>) -> &'static str; | ||||
|     /// Parse a header from a raw stream of bytes. | ||||
|     /// | ||||
| @@ -106,7 +109,7 @@ impl Headers { | ||||
|     /// Set a header field to the corresponding value. | ||||
|     /// | ||||
|     /// The field is determined by the type of the value being set. | ||||
|     pub fn set<H: Header + 'static>(&mut self, value: H) { | ||||
|     pub fn set<H: Header>(&mut self, value: H) { | ||||
|         self.data.insert(header_name::<H>(), Typed(box value)); | ||||
|     } | ||||
|  | ||||
| @@ -119,12 +122,12 @@ impl Headers { | ||||
|     /// # let mut headers = Headers::new(); | ||||
|     /// let content_type = headers.get::<ContentType>(); | ||||
|     /// ``` | ||||
|     pub fn get<H: Header + Clone + 'static>(&mut self) -> Option<H> { | ||||
|     pub fn get<H: Header + Clone>(&mut self) -> Option<H> { | ||||
|         self.get_ref().map(|v: &H| v.clone()) | ||||
|     } | ||||
|  | ||||
|     /// Get a reference to the header field's value, if it exists. | ||||
|     pub fn get_ref<H: Header + 'static>(&mut self) -> Option<&H> { | ||||
|     pub fn get_ref<H: Header>(&mut self) -> Option<&H> { | ||||
|         self.data.find_mut(&header_name::<H>()).and_then(|item| { | ||||
|             debug!("get_ref, name={}, val={}", header_name::<H>(), item); | ||||
|             let header = match *item { | ||||
| @@ -136,7 +139,7 @@ impl Headers { | ||||
|                 }, | ||||
|                 Typed(..) => return Some(item) | ||||
|             }; | ||||
|             *item = Typed(box header as Box<Header + 'static>); | ||||
|             *item = Typed(box header as Box<Header>); | ||||
|             Some(item) | ||||
|         }).and_then(|item| { | ||||
|             debug!("downcasting {}", item); | ||||
| @@ -162,7 +165,7 @@ impl Headers { | ||||
|     /// # let mut headers = Headers::new(); | ||||
|     /// let has_type = headers.has::<ContentType>(); | ||||
|     /// ``` | ||||
|     pub fn has<H: Header + 'static>(&self) -> bool { | ||||
|     pub fn has<H: Header>(&self) -> bool { | ||||
|         self.data.contains_key(&header_name::<H>()) | ||||
|     } | ||||
|  | ||||
| @@ -227,7 +230,7 @@ impl Mutable for Headers { | ||||
|  | ||||
| enum Item { | ||||
|     Raw(Vec<Vec<u8>>), | ||||
|     Typed(Box<Header + 'static>) | ||||
|     Typed(Box<Header>) | ||||
| } | ||||
|  | ||||
| impl fmt::Show for Item { | ||||
| @@ -498,6 +501,27 @@ impl Header for UserAgent { | ||||
|     } | ||||
| } | ||||
|  | ||||
| /// The `Server` header field. | ||||
| /// | ||||
| /// They can contain any value, so it just wraps a `String`. | ||||
| #[deriving(Clone, PartialEq, Show)] | ||||
| pub struct Server(pub String); | ||||
|  | ||||
| impl Header for Server { | ||||
|     fn header_name(_: Option<Server>) -> &'static str { | ||||
|         "server" | ||||
|     } | ||||
|  | ||||
|     fn parse_header(raw: &[Vec<u8>]) -> Option<Server> { | ||||
|         from_one_raw_str(raw).map(|s| Server(s)) | ||||
|     } | ||||
|  | ||||
|     fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result { | ||||
|         let Server(ref value) = *self; | ||||
|         value.fmt(fmt) | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn from_one_raw_str<T: FromStr>(raw: &[Vec<u8>]) -> Option<T> { | ||||
|     if raw.len() != 1 { | ||||
|         return None; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user