use hyper::header::ContentType;
use hyper::method::Method;
use hyper::server::Request as HyperRequest;
use mime::{Mime, TopLevel, SubLevel, Attr, Value};
use super::Multipart;
impl Multipart {
pub fn from_request<T>(req: &HyperRequest<T>) -> Option<Self> {
if let Method::Post = *req.method() {
get_boundary(req).map(Self::new)
} else {
None
}
}
}
fn get_boundary<'a, T>(req: &'a HyperRequest<T>) -> Option<&'a str> {
req.headers().get::<ContentType>()
.and_then(|&ContentType(ref mime)| get_boundary_mime(mime))
}
fn get_boundary_mime(mime: &Mime) -> Option<&str> {
if let Mime(TopLevel::Multipart, SubLevel::FormData, _) = *mime {
mime.get_param(Attr::Boundary)
.and_then(|val| match *val {
Value::Ext(ref val) => Some(&**val),
_ => None
})
} else {
None
}
}