xt_oss/oss/
http.rs

1use serde::{Deserialize, Serialize};
2use std::fmt;
3
4pub use reqwest::{
5    header::{self, HeaderMap, HeaderName, HeaderValue},
6    IntoUrl, Method, StatusCode, Url,
7};
8
9#[derive(Default, Debug, Clone, Copy)]
10pub enum ContentEncoding {
11    /// 表示Object未经过压缩或编码
12    #[default]
13    IDENTITY,
14    /// 表示Object采用Lempel-Ziv`LZ77`压缩算法以及32位CRC校验的编码方式。
15    GZIP,
16    /// 表示Object采用Lempel-Ziv-Welch`LZW`压缩算法的编码方式。
17    COMPRESS,
18    /// 表示Object采用zlib结构和deflate压缩算法的编码方式。
19    DEFLATE,
20    /// 表示Object采用Brotli算法的编码方式。
21    BR,
22}
23
24impl fmt::Display for ContentEncoding {
25    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
26        write!(
27            f,
28            "{}",
29            match self {
30                Self::IDENTITY => "IDENTITY",
31                Self::GZIP => "GZIP",
32                Self::COMPRESS => "COMPRESS",
33                Self::DEFLATE => "DEFLATE",
34                Self::BR => "br",
35            }
36        )
37    }
38}
39
40#[derive(Default, Debug, Clone, Serialize, Deserialize)]
41pub enum ContentDisposition {
42    #[default]
43    INLINE,
44    ATTACHMENT(Option<String>),
45}
46
47impl fmt::Display for ContentDisposition {
48    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49        write!(
50            f,
51            "{}",
52            match self {
53                Self::INLINE => "inline".to_owned(),
54                Self::ATTACHMENT(Some(filename)) => format!("attachment;filename=\"{}\"", filename),
55                Self::ATTACHMENT(None) => "attachment".to_owned(),
56            }
57        )
58    }
59}
60
61/// 指定该Object被下载时网页的缓存行为
62#[derive(Debug, Default, Clone, Copy)]
63pub enum CacheControl {
64    /// 不可直接使用缓存,而是先到服务端验证Object是否已更新。如果Object已更新,表明缓存已过期,需从服务端重新下载Object;如果Object未更新,表明缓存未过期,此时将使用本地缓存。
65    NoCache,
66    ///所有内容都不会被缓存。
67    NoStore,
68    /// 所有内容都将被缓存。
69    #[default]
70    PUBLIC,
71    /// 所有内容只在客户端缓存。
72    PRIVATE,
73    /// 缓存内容的相对过期时间,单位为秒。此选项仅在HTTP 1.1中可用。
74    MaxAge(u32),
75}
76
77impl fmt::Display for CacheControl {
78    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79        write!(
80            f,
81            "{}",
82            match self {
83                CacheControl::NoCache => "no-cache".into(),
84                CacheControl::NoStore => "no-store".into(),
85                CacheControl::PUBLIC => "public".into(),
86                CacheControl::PRIVATE => "private".into(),
87                CacheControl::MaxAge(seconds) => format!("max-age=<{}>", seconds),
88            }
89        )
90    }
91}
92
93#[cfg(test)]
94mod tests {
95
96    #[test]
97    fn content_disposition_1() {
98        let filename: Option<String> = Some("测试.txt".to_string());
99        let value = crate::oss::http::ContentDisposition::ATTACHMENT(filename);
100        assert!(value.to_string().contains("测试"))
101    }
102}