47 releases

0.19.18 Jan 30, 2024
0.19.16 Nov 25, 2023
0.19.15 Jul 2, 2023
0.19.13 Jan 23, 2023
0.19.1 Feb 28, 2022

#70 in Parser implementations

Download history 12663/week @ 2023-11-24 11698/week @ 2023-12-01 11843/week @ 2023-12-08 11717/week @ 2023-12-15 5197/week @ 2023-12-22 8621/week @ 2023-12-29 13709/week @ 2024-01-05 13736/week @ 2024-01-12 12381/week @ 2024-01-19 13679/week @ 2024-01-26 12464/week @ 2024-02-02 11737/week @ 2024-02-09 11893/week @ 2024-02-16 10989/week @ 2024-02-23 12443/week @ 2024-03-01 7858/week @ 2024-03-08

45,608 downloads per month
Used in 47 crates (16 directly)

MIT license

290KB
1.5K SLoC

MediaType

MIME Media-type parsing for Rust

Crates.io dependency status GitHub license Rustdoc Rust

Parsing

MediaType::parse runs a zero-copy parsing: A MediaType borrows the input string instead of copying it.

If you need an owned type, use MediaTypeBuf.

use mediatype::{names::*, values::*, MediaType};

let madia_type = "image/svg+xml; charset=UTF-8";
let svg = MediaType::parse(madia_type).unwrap();

assert_eq!(svg.ty, IMAGE);
assert_eq!(svg.subty, SVG);
assert_eq!(svg.suffix, Some(XML));
assert_eq!(svg.get_param(CHARSET), Some(UTF_8));

Construction

MediaType is const-constructible. It can be defined as a constant.

Predefind names and values are defined in names and values modules.

use mediatype::{names::*, values::*, media_type, MediaType};

const TEXT_PLAIN: MediaType = MediaType::new(TEXT, PLAIN);

const IMAGE_SVG: MediaType = 
  MediaType::from_parts(TEXT, PLAIN, Some(XML), &[(CHARSET, UTF_8)]);

const TEXT_MARKDOWN: MediaType = 
  media_type!(TEXT/MARKDOWN; CHARSET=UTF_8);

Parameters

Case Sensitivity

Comparisons are case-insensitive except parameter values.

let text_plain_lower = MediaType::parse("text/plain; charset=UTF-8").unwrap();
let text_plain_upper = MediaType::parse("TEXT/PLAIN; CHARSET=UTF-8").unwrap();

assert_eq!(text_plain_lower, text_plain_upper);
assert_eq!(text_plain_lower.ty(), "Text");
assert_eq!(text_plain_upper.subty(), "Plain");
assert!(text_plain_lower != 
  MediaType::parse("text/plain; charset=utf-8").unwrap());

Duplicate Parameter Names

The parser does not report duplicate parameter names as an error, but MediaType recognizes only the last value.

let text_plain = MediaType::parse(
  "text/plain; charset=US-ASCII; charset=UTF-8").unwrap();

assert_eq!(
    text_plain.to_string(),
    "text/plain; charset=US-ASCII; charset=UTF-8"
);

// Return the last charset value.
assert_eq!(text_plain.get_param(CHARSET), Some(UTF_8));

// Compare the last charset value.
assert_eq!(
    text_plain,
    MediaType::parse("text/plain; charset=UTF-8").unwrap()
);

Owned Type

MediaTypeBuf is an owned version of MediaType. It is immutable but optimized for minimal stack and heap usage.

use mediatype::{names::*, values::*, MediaType, MediaTypeBuf};

let text_plain: MediaTypeBuf = "text/plain; charset=UTF-8".parse().unwrap();
assert_eq!(text_plain.get_param(CHARSET).unwrap(), UTF_8);

// Convert to MediaType
let mut text_markdown: MediaType = text_plain.to_ref();
text_markdown.subty = MARKDOWN;
assert_eq!(text_markdown.to_string(), "text/markdown; charset=UTF-8");

MediaTypeList

MediaTypeList parses a comma-separated list of MediaTypes used in the HTTP Accept header. (RFC 7231)

use mediatype::{MediaType, MediaTypeList};

let mut list = MediaTypeList::new(
    "text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8",
);
assert_eq!(list.next(), Some(MediaType::parse("text/html")));
assert_eq!(list.next(), Some(MediaType::parse("application/xhtml+xml")));
assert_eq!(list.next(), Some(MediaType::parse("application/xml;q=0.9")));
assert_eq!(list.next(), Some(MediaType::parse("*/*;q=0.8")));
assert_eq!(list.next(), None);

Serialize and Deserialize

To enable serialization and deserialization, specify serde feature in Cargo.toml.

mediatype = { version = "...", features = ["serde"] }
let json = r#"
    [
        "text/plain",
        "image/svg+xml; charset=UTF-8"
    ]
"#;

let decoded: Vec<MediaType> = serde_json::from_str(json).unwrap();

Dependencies

~185KB