diff --git a/src/header/common/accept.rs b/src/header/common/accept.rs index 68f1d1aa..89c0bd8b 100644 --- a/src/header/common/accept.rs +++ b/src/header/common/accept.rs @@ -1,5 +1,6 @@ use header::Header; use std::fmt::{mod, Show}; +use std::str::from_utf8; use mime::Mime; /// The `Accept` header. @@ -25,8 +26,28 @@ impl Header for Accept { "Accept" } - fn parse_header(_raw: &[Vec]) -> Option { - unimplemented!() + fn parse_header(raw: &[Vec]) -> Option { + let mut mimes: Vec = 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 { diff --git a/src/header/mod.rs b/src/header/mod.rs index 7dc8e9a5..005ef8b7 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -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([b"text/plain".to_vec()].as_slice()); + assert_eq!(accept, Some(Accept(vec![text_plain.clone()]))); + + let accept = Header::parse_header([b"application/vnd.github.v3.full+json; q=0.5, text/plain".to_vec()].as_slice()); + assert_eq!(accept, Some(Accept(vec![application_vendor, text_plain]))); + } + #[deriving(Clone)] struct CrazyLength(Option, uint);