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 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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user