Implement the basic parsing for Accept header.
This commit is contained in:
		| @@ -1,5 +1,6 @@ | ||||
| use header::Header; | ||||
| use std::fmt::{mod, Show}; | ||||
| use std::str::from_utf8; | ||||
| use mime::Mime; | ||||
|  | ||||
| /// The `Accept` header. | ||||
| @@ -26,7 +27,27 @@ impl Header for Accept { | ||||
|     } | ||||
|  | ||||
|     fn parse_header(_raw: &[Vec<u8>]) -> Option<Accept> { | ||||
|         unimplemented!() | ||||
|         let mut mimes: Vec<Mime> = vec![]; | ||||
|         for mimes_raw in _raw.iter() { | ||||
|             match from_utf8(mimes_raw.as_slice()) { | ||||
|                 Some(mimes_str) => { | ||||
|                     for mime_str in mimes_str.split(',') { | ||||
|                         match from_str(mime_str.trim()) { | ||||
|                             Some(mime) => mimes.push(mime), | ||||
|                             None => return None | ||||
|                         } | ||||
|                     } | ||||
|                 }, | ||||
|                 None => return None | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         if !mimes.is_empty() { | ||||
|             Some(Accept(mimes)) | ||||
|         } else { | ||||
|             // Currently is just a None, but later it can be Accept for */* | ||||
|             None | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result { | ||||
|   | ||||
| @@ -356,7 +356,7 @@ mod tests { | ||||
|     use mime::{Mime, Text, Plain}; | ||||
|     use super::CaseInsensitive; | ||||
|     use super::{Headers, Header}; | ||||
|     use super::common::{ContentLength, ContentType}; | ||||
|     use super::common::{ContentLength, ContentType, Accept}; | ||||
|  | ||||
|     fn mem(s: &str) -> MemReader { | ||||
|         MemReader::new(s.as_bytes().to_vec()) | ||||
| @@ -383,6 +383,18 @@ mod tests { | ||||
|         assert_eq!(content_type, Some(ContentType(Mime(Text, Plain, vec![])))); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn test_accept() { | ||||
|         let text_plain = Mime(Text, Plain, vec![]); | ||||
|         let application_vendor = from_str("application/vnd.github.v3.full+json; q=0.5").unwrap(); | ||||
|  | ||||
|         let accept = Header::parse_header(["text/plain".as_bytes().to_vec()].as_slice()); | ||||
|         assert_eq!(accept, Some(Accept(vec![text_plain.clone()]))); | ||||
|          | ||||
|         let accept = Header::parse_header(["application/vnd.github.v3.full+json; q=0.5, text/plain".as_bytes().to_vec()].as_slice()); | ||||
|         assert_eq!(accept, Some(Accept(vec![application_vendor, text_plain]))); | ||||
|     } | ||||
|  | ||||
|     #[deriving(Clone)] | ||||
|     struct CrazyLength(Option<bool>, uint); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user