Implement the basic parsing for Accept header.
This commit is contained in:
		| @@ -1,5 +1,6 @@ | |||||||
| use header::Header; | use header::Header; | ||||||
| use std::fmt::{mod, Show}; | use std::fmt::{mod, Show}; | ||||||
|  | use std::str::from_utf8; | ||||||
| use mime::Mime; | use mime::Mime; | ||||||
|  |  | ||||||
| /// The `Accept` header. | /// The `Accept` header. | ||||||
| @@ -26,7 +27,27 @@ impl Header for Accept { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn parse_header(_raw: &[Vec<u8>]) -> Option<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 { |     fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result { | ||||||
|   | |||||||
| @@ -356,7 +356,7 @@ mod tests { | |||||||
|     use mime::{Mime, Text, Plain}; |     use mime::{Mime, Text, Plain}; | ||||||
|     use super::CaseInsensitive; |     use super::CaseInsensitive; | ||||||
|     use super::{Headers, Header}; |     use super::{Headers, Header}; | ||||||
|     use super::common::{ContentLength, ContentType}; |     use super::common::{ContentLength, ContentType, Accept}; | ||||||
|  |  | ||||||
|     fn mem(s: &str) -> MemReader { |     fn mem(s: &str) -> MemReader { | ||||||
|         MemReader::new(s.as_bytes().to_vec()) |         MemReader::new(s.as_bytes().to_vec()) | ||||||
| @@ -383,6 +383,18 @@ mod tests { | |||||||
|         assert_eq!(content_type, Some(ContentType(Mime(Text, Plain, vec![])))); |         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)] |     #[deriving(Clone)] | ||||||
|     struct CrazyLength(Option<bool>, uint); |     struct CrazyLength(Option<bool>, uint); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user