2个版本

0.1.1 2021年4月27日
0.1.0 2021年4月27日

#927 in 文本处理

Download history 272/week @ 2024-03-13 438/week @ 2024-03-20 160/week @ 2024-03-27 508/week @ 2024-04-03 604/week @ 2024-04-10 543/week @ 2024-04-17 548/week @ 2024-04-24 525/week @ 2024-05-01 467/week @ 2024-05-08 439/week @ 2024-05-15 677/week @ 2024-05-22 363/week @ 2024-05-29 437/week @ 2024-06-05 200/week @ 2024-06-12 547/week @ 2024-06-19 391/week @ 2024-06-26

1,651 每月下载量
用于 utube

MIT 许可证

98KB
2.5K SLoC

基于似乎未维护的 mime crate

mime

Build Status crates.io docs.rs

支持MIME(HTTP媒体类型)在Rust中的强类型。

文档

用法

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 = neo_mime::TEXT_PLAIN;
let svg = neo_mime::IMAGE_SVG;
let json = neo_mime::APPLICATION_JSON;
// etc

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

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

检查MediaType

一旦你有了MediaType,你可以检查它的各个部分。由于type_()subtype()方法返回&str,你可以轻松创建match语句来处理不同的媒体类型。为了避免错误,许多常见的类型名称都作为常量提供。

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

使用媒体范围进行匹配

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

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

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

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

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

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

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

依赖关系

~95–375KB