Merge pull request #69 from s-panferov/feature/accept-header-parsing

Implement the basic parsing for Accept header.
This commit is contained in:
Sean McArthur
2014-10-06 11:32:19 -07:00
2 changed files with 36 additions and 3 deletions

View File

@@ -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.
@@ -25,8 +26,28 @@ impl Header for Accept {
"Accept" "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 {

View File

@@ -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([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)] #[deriving(Clone)]
struct CrazyLength(Option<bool>, uint); struct CrazyLength(Option<bool>, uint);