diff --git a/components/net/mime_classifier.rs b/components/net/mime_classifier.rs index 3b97566f018..e9bc4ed4f4f 100644 --- a/components/net/mime_classifier.rs +++ b/components/net/mime_classifier.rs @@ -28,6 +28,20 @@ pub enum ApacheBugFlag { OFF } +impl ApacheBugFlag { + /// https://mimesniff.spec.whatwg.org/#supplied-mime-type-detection-algorithm + pub fn from_content_type(last_raw_content_type: &[u8]) -> ApacheBugFlag { + if last_raw_content_type == b"text/plain" + || last_raw_content_type == b"text/plain; charset=ISO-8859-1" + || last_raw_content_type == b"text/plain; charset=iso-8859-1" + || last_raw_content_type == b"text/plain; charset=UTF-8" { + ApacheBugFlag::ON + } else { + ApacheBugFlag::OFF + } + } +} + #[derive(PartialEq)] pub enum NoSniffFlag { ON, diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index 7980f707139..e5cf4669bae 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -83,11 +83,8 @@ pub fn start_sending_sniffed_opt(start_chan: LoadConsumer, mut metadata: Metadat let mut check_for_apache_bug = ApacheBugFlag::OFF; if let Some(ref headers) = metadata.headers { - if let Some(ref raw_content_type) = headers.get_raw("content-type") { - if raw_content_type.len() > 0 { - let last_raw_content_type = &raw_content_type[raw_content_type.len() - 1]; - check_for_apache_bug = apache_bug_predicate(last_raw_content_type) - } + if let Some(ref content_type) = headers.get_raw("content-type").and_then(|c| c.last()) { + check_for_apache_bug = ApacheBugFlag::from_content_type(content_type) } if let Some(ref raw_content_type_options) = headers.get_raw("X-content-type-options") { if raw_content_type_options.iter().any(|ref opt| *opt == b"nosniff") { @@ -113,17 +110,6 @@ pub fn start_sending_sniffed_opt(start_chan: LoadConsumer, mut metadata: Metadat start_sending_opt(start_chan, metadata) } -fn apache_bug_predicate(last_raw_content_type: &[u8]) -> ApacheBugFlag { - if last_raw_content_type == b"text/plain" - || last_raw_content_type == b"text/plain; charset=ISO-8859-1" - || last_raw_content_type == b"text/plain; charset=iso-8859-1" - || last_raw_content_type == b"text/plain; charset=UTF-8" { - ApacheBugFlag::ON - } else { - ApacheBugFlag::OFF - } -} - /// For use by loaders in responding to a Load message. fn start_sending_opt(start_chan: LoadConsumer, metadata: Metadata) -> Result { match start_chan {