From f6ac243c855dbb57f4675106f8008e52e44e193c Mon Sep 17 00:00:00 2001 From: Stanislav Panferov Date: Mon, 6 Oct 2014 19:56:32 +0400 Subject: [PATCH 1/2] Implement the basic parsing for Accept header. --- src/header/common/accept.rs | 23 ++++++++++++++++++++++- src/header/mod.rs | 14 +++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/header/common/accept.rs b/src/header/common/accept.rs index 68f1d1aa..9c592f2f 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. @@ -26,7 +27,27 @@ impl Header for Accept { } fn parse_header(_raw: &[Vec]) -> Option { - unimplemented!() + 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..a990d9e8 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(["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, uint); From 299592350535b58b3e949a83059234348f2d37ce Mon Sep 17 00:00:00 2001 From: Stanislav Panferov Date: Mon, 6 Oct 2014 22:27:08 +0400 Subject: [PATCH 2/2] Fix review comments --- src/header/common/accept.rs | 4 ++-- src/header/mod.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/header/common/accept.rs b/src/header/common/accept.rs index 9c592f2f..89c0bd8b 100644 --- a/src/header/common/accept.rs +++ b/src/header/common/accept.rs @@ -26,9 +26,9 @@ impl Header for Accept { "Accept" } - fn parse_header(_raw: &[Vec]) -> Option { + fn parse_header(raw: &[Vec]) -> Option { let mut mimes: Vec = vec![]; - for mimes_raw in _raw.iter() { + for mimes_raw in raw.iter() { match from_utf8(mimes_raw.as_slice()) { Some(mimes_str) => { for mime_str in mimes_str.split(',') { diff --git a/src/header/mod.rs b/src/header/mod.rs index a990d9e8..005ef8b7 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -388,10 +388,10 @@ mod tests { 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()); + 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(["application/vnd.github.v3.full+json; q=0.5, text/plain".as_bytes().to_vec()].as_slice()); + 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]))); }