use mime::Mime;
pub fn is_mime_allowed(mime: &Mime, allowed: &Vec<Mime>) -> bool {
const WILDCARD: &str = "*";
if allowed.is_empty() {
return false;
}
for allowed_mime in allowed {
if allowed_mime.type_() == WILDCARD && allowed_mime.subtype() == WILDCARD {
return true;
}
if allowed_mime.subtype() == WILDCARD && allowed_mime.type_() == mime.type_() {
return true;
}
if mime == allowed_mime {
return true;
}
}
false
}
#[cfg(test)]
mod tests {
use mime::Mime;
use std::str::FromStr;
#[test]
fn test_is_mime_allowed() {
assert_eq!(
super::is_mime_allowed(&Mime::from_str("image/png").unwrap(), &vec![]),
false
);
assert_eq!(
super::is_mime_allowed(
&Mime::from_str("image/png").unwrap(),
&vec![mime::IMAGE_PNG],
),
true
);
assert_eq!(
super::is_mime_allowed(
&Mime::from_str("image/png").unwrap(),
&vec![mime::IMAGE_JPEG],
),
false
);
assert_eq!(
super::is_mime_allowed(
&Mime::from_str("image/png").unwrap(),
&vec![mime::IMAGE_STAR],
),
true
);
assert_eq!(
super::is_mime_allowed(
&Mime::from_str("image/png").unwrap(),
&vec![mime::STAR_STAR],
),
true
);
assert_eq!(
super::is_mime_allowed(
&Mime::from_str("text/html").unwrap(),
&vec![mime::IMAGE_STAR],
),
false
);
assert_eq!(
super::is_mime_allowed(
&Mime::from_str("image/png").unwrap(),
&vec![mime::TEXT_STAR, mime::IMAGE_STAR],
),
true
);
}
}