1 个不稳定版本

0.4.0-a.02021年1月29日

文本处理 中排名 1277

Download history 52/week @ 2024-03-11 61/week @ 2024-03-18 50/week @ 2024-03-25 77/week @ 2024-04-01 64/week @ 2024-04-08 47/week @ 2024-04-15 28/week @ 2024-04-22 46/week @ 2024-04-29 34/week @ 2024-05-06 48/week @ 2024-05-13 61/week @ 2024-05-20 27/week @ 2024-05-27 30/week @ 2024-06-03 37/week @ 2024-06-10 42/week @ 2024-06-17 39/week @ 2024-06-24

每月下载 149
10 个crate中使用了(通过 site_icons

MIT 许可证

97KB
2.5K SLoC

mime

Build Status crates.io docs.rs

支持在Rust中以强类型的形式处理MIME(HTTP媒体类型)。

文档

使用方法

extern crate mime;

fn main() {
    // common types are constants
    let text = mime::TEXT_PLAIN;

    // deconstruct Mimes to match on them
    match (text.type_(), text.subtype()) {
        (mime::TEXT, mime::PLAIN) => {
            // plain text!
        },
        (mime::TEXT, _) => {
            // structured text!
        },
        _ => {
            // not text!
        }
    }
}

lib.rs:

MediaType和MediaRange

mime crate定义了两种主要类型,用于在HTTP环境中表示MIME

  • MediaType 是某些内容的具体描述,例如 text/plain
  • MediaRange 是代理愿意接收的类型范围,例如 text/*

获取 MediaType

导出了几个常量,用于常见的媒体类型

let text = mime::TEXT_PLAIN;
let svg = mime::IMAGE_SVG;
let json = mime::APPLICATION_JSON;
// etc

MediaType 也可以从字符串解析,例如从 Content-Type HTTP头中

match mime::MediaType::parse("text/plain; charset=utf-8") {
    Ok(text) => assert_eq!(text, mime::TEXT_PLAIN_UTF_8),
    Err(err) => panic!("you should handle this parse error: {}", err),
}

检查 MediaType

一旦你有了 MediaType,你可以检查它的各个部分。由于 type_subtype 方法返回 &str,你可以通过 match 语句轻松处理不同的媒体类型。为了避免打字错误,许多常见的类型名称都可用作常量。

let mime = mime::TEXT_PLAIN;
match (mime.type_(), mime.subtype()) {
    (mime::TEXT, mime::PLAIN) => println!("plain text!"),
    (mime::TEXT, _) => println!("structured text"),
    _ => println!("not text"),
}

使用媒体范围进行匹配

MediaRange 通常由代理用于声明它们可以理解的“范围”媒体类型。这些通常可以在 Accept HTTP头中找到,例如这样

GET /index.html HTTP/1.1
Accept: text/html, text/*

这些可以解析为 MediaRange,然后用于检查你有的任何 MediaType 是否能满足它们。

match mime::MediaRange::parse("text/*") {
    Ok(range) => {
        // There's a couple constants in case you don't need parsing...
        assert_eq!(range, mime::TEXT_STAR);

        // "text/plain" is a match
        assert!(range.matches(&mime::TEXT_PLAIN));

        // "application/json" is NOT
        assert!(!range.matches(&mime::APPLICATION_JSON));

    },
    Err(err) => panic!("that's a bad range: {}", err),
}

依赖项

~95–445KB
~10K SLoC