From 25bdb023845a2fc247731ce2e71019d749c5d20c Mon Sep 17 00:00:00 2001 From: Martin Robinson Date: Mon, 19 May 2025 11:15:51 +0200 Subject: [PATCH] Add some some basic functions to `Mime` This adds `Clone`, `fn new()`, and `fn matches()` to `Mime`. Servo uses `data_url::Mime` in places as it supports charsets and these helpers make it a lot nicer to use. --- data-url/Cargo.toml | 2 +- data-url/README.md | 3 +-- data-url/src/lib.rs | 3 +-- data-url/src/mime.rs | 32 +++++++++++++++++++++++++++++++- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/data-url/Cargo.toml b/data-url/Cargo.toml index a831f1e39..3b680e293 100644 --- a/data-url/Cargo.toml +++ b/data-url/Cargo.toml @@ -23,7 +23,7 @@ serde = { version = "1.0", default-features = false, features = ["alloc", "deriv serde_json = "1.0" [lib] -test = false +test = true [[test]] name = "wpt" diff --git a/data-url/README.md b/data-url/README.md index 9975d6b99..1db2fe3bc 100644 --- a/data-url/README.md +++ b/data-url/README.md @@ -13,8 +13,7 @@ use data_url::{DataUrl, mime}; let url = DataUrl::process("data:,Hello%20World!").unwrap(); let (body, fragment) = url.decode_to_vec().unwrap(); -assert_eq!(url.mime_type().type_, "text"); -assert_eq!(url.mime_type().subtype, "plain"); +assert!(url.mime_type().is("text", "plain")); assert_eq!(url.mime_type().get_parameter("charset"), Some("US-ASCII")); assert_eq!(body, b"Hello World!"); assert!(fragment.is_none()); diff --git a/data-url/src/lib.rs b/data-url/src/lib.rs index 00689e3d4..44966a132 100644 --- a/data-url/src/lib.rs +++ b/data-url/src/lib.rs @@ -8,8 +8,7 @@ //! let url = DataUrl::process("data:,Hello%20World!").unwrap(); //! let (body, fragment) = url.decode_to_vec().unwrap(); //! -//! assert_eq!(url.mime_type().type_, "text"); -//! assert_eq!(url.mime_type().subtype, "plain"); +//! assert!(url.mime_type().matches("text", "plain")); //! assert_eq!(url.mime_type().get_parameter("charset"), Some("US-ASCII")); //! assert_eq!(body, b"Hello World!"); //! assert!(fragment.is_none()); diff --git a/data-url/src/mime.rs b/data-url/src/mime.rs index 847c7a2ce..827ab30fc 100644 --- a/data-url/src/mime.rs +++ b/data-url/src/mime.rs @@ -3,7 +3,7 @@ use core::fmt::{self, Write}; use core::str::FromStr; /// -#[derive(Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Mime { pub type_: String, pub subtype: String, @@ -12,6 +12,20 @@ pub struct Mime { } impl Mime { + pub fn new(type_: &str, subtype: &str) -> Self { + Self { + type_: type_.into(), + subtype: subtype.into(), + parameters: vec![], + } + } + + /// Return true if this [`Mime`] matches a given type and subtype, regardless + /// of what parameters it has. + pub fn matches(&self, type_: &str, subtype: &str) -> bool { + self.type_ == type_ && self.subtype == subtype + } + pub fn get_parameter

(&self, name: &P) -> Option<&str> where P: ?Sized + PartialEq, @@ -205,3 +219,19 @@ static IS_HTTP_TOKEN: [bool; 256] = byte_map![ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; + +#[test] +fn test_basic_mime() { + let mime = Mime::new("text", "plain"); + assert!(mime.matches("text", "plain")); + + let cloned = mime.clone(); + assert!(cloned.matches("text", "plain")); + + let mime = Mime { + type_: "text".into(), + subtype: "html".into(), + parameters: vec![("one".into(), "two".into())], + }; + assert!(mime.matches("text", "html")); +}