aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/mime.rs
blob: 8d45e84252ab76211d03fca8fb2f055f0571027f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

use data_url::mime::Mime;
use headers::ContentType;

pub(crate) static APPLICATION: &str = "application";
pub(crate) static CHARSET: &str = "charset";
pub(crate) static HTML: &str = "html";
pub(crate) static TEXT: &str = "text";
pub(crate) static XML: &str = "xml";

/// Convenience methods to make the data_url Mime type more ergonomic.
pub(crate) trait MimeExt {
    /// Creates a new Mime from type and subtype, without any parameter.
    fn new(type_: &str, subtype: &str) -> Self;

    /// Checks that this Mime matches a given type and subtype, ignoring
    /// parameters.
    fn matches(&self, type_: &str, subtype: &str) -> bool;

    /// Checks that the subtype has a given suffix.
    /// Eg. image/svg+xml has the the xml suffix.
    fn has_suffix(&self, suffix: &str) -> bool;

    /// TODO: replace by a derive on data_url.
    fn clone(&self) -> Self;

    /// Build a Mime from the value of a Content-Type header.
    fn from_ct(ct: ContentType) -> Self;
}

impl MimeExt for Mime {
    fn new(type_: &str, subtype: &str) -> Self {
        Mime {
            type_: type_.into(),
            subtype: subtype.into(),
            parameters: vec![],
        }
    }

    fn matches(&self, type_: &str, subtype: &str) -> bool {
        self.type_ == type_ && self.subtype == subtype
    }

    fn has_suffix(&self, suffix: &str) -> bool {
        self.subtype.ends_with(&format!("+{}", suffix))
    }

    fn clone(&self) -> Self {
        Self {
            type_: self.type_.clone(),
            subtype: self.subtype.clone(),
            parameters: self.parameters.clone(),
        }
    }

    fn from_ct(ct: ContentType) -> Self {
        ct.to_string().parse().unwrap()
    }
}