Merge pull request #69 from s-panferov/feature/accept-header-parsing
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.
|
||||
@@ -25,8 +26,28 @@ impl Header for Accept {
|
||||
"Accept"
|
||||
}
|
||||
|
||||
fn parse_header(_raw: &[Vec<u8>]) -> Option<Accept> {
|
||||
unimplemented!()
|
||||
fn parse_header(raw: &[Vec<u8>]) -> Option<Accept> {
|
||||
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([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<bool>, uint);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user