Типы Медиа

Получение MIME типа из строки

mime-badge cat-encoding-badge

Этот пример показывает, как осуществить разбор в тип MIME из некоторой строки при помощи функций из крейта mime. FromStrError выводит MIME тип по умолчанию для параметра, переданного в unwrap_or.

extern crate mime;
use mime::{Mime, APPLICATION_OCTET_STREAM};

fn main() {
    let invalid_mime_type = "i n v a l i d";
    let default_mime = invalid_mime_type
        .parse::<Mime>()
        .unwrap_or(APPLICATION_OCTET_STREAM);

    println!(
        "MIME for {:?} used default value {:?}",
        invalid_mime_type, default_mime
    );

    let valid_mime_type = "TEXT/PLAIN";
    let parsed_mime = valid_mime_type
        .parse::<Mime>()
        .unwrap_or(APPLICATION_OCTET_STREAM);

    println!(
        "MIME for {:?} was parsed as {:?}",
        valid_mime_type, parsed_mime
    );
}

Получение MIME типа из строки

mime-badge cat-encoding-badge

Этот пример показывает, как осуществить разбор в тип MIME из некоторой строки при помощи функций из крейта mime. FromStrError выводит MIME тип по умолчанию для параметра, переданного в unwrap_or.

extern crate mime;
use mime::{Mime, APPLICATION_OCTET_STREAM};

fn main() {
    let invalid_mime_type = "i n v a l i d";
    let default_mime = invalid_mime_type
        .parse::<Mime>()
        .unwrap_or(APPLICATION_OCTET_STREAM);

    println!(
        "MIME for {:?} used default value {:?}",
        invalid_mime_type, default_mime
    );

    let valid_mime_type = "TEXT/PLAIN";
    let parsed_mime = valid_mime_type
        .parse::<Mime>()
        .unwrap_or(APPLICATION_OCTET_STREAM);

    println!(
        "MIME for {:?} was parsed as {:?}",
        valid_mime_type, parsed_mime
    );
}

Разбор MIME типа из HTTP ответа

reqwest-badge mime-badge cat-net-badge cat-encoding-badge

В ответе запроса по HTTP через reqwest найти MIME type-тип или тип мультимедиа может быть возможно через заголовок Content-Type. reqwest::header::HeaderMap::get разбирает содержимое заголовка и делает любое значение доступным как reqwest::header::HeaderValue, которое может быть преобразовано в строку. Крейт mime может затем произвести разбор этой строки и выдать значение типа mime::Mime.

Крейт mime также определяет широко используемые типы MIME.

Заметим, что модуль reqwest::header экспортируется из крейта http.

#[macro_use]
extern crate error_chain;
extern crate mime;
extern crate reqwest;

use mime::Mime;
use std::str::FromStr;
use reqwest::header::CONTENT_TYPE;


error_chain! {
   foreign_links {
       Reqwest(reqwest::Error);
       Header(reqwest::header::ToStrError);
       Mime(mime::FromStrError);
   }
}

fn main() -> Result<()> {
    let response = reqwest::get("https://www.rust-lang.org/logos/rust-logo-32x32.png")?;
    let headers = response.headers();

    match headers.get(CONTENT_TYPE) {
        None => {
            println!("The response does not contain a Content-Type header.");
        }
        Some(content_type) => {
            let content_type = Mime::from_str(content_type.to_str()?)?;
            let media_type = match (content_type.type_(), content_type.subtype()) {
                (mime::TEXT, mime::HTML) => "a HTML document",
                (mime::TEXT, _) => "a text document",
                (mime::IMAGE, mime::PNG) => "a PNG image",
                (mime::IMAGE, _) => "an image",
                _ => "neither text nor image",
            };

            println!("The reponse contains {}.", media_type);
        }
    };

    Ok(())
}