Skip to main content

framework_web_axum/
cors.rs

1use framework_core::MultiStringValue;
2use std::sync::LazyLock;
3
4static FIXED: LazyLock<AxumCors> = LazyLock::new(AxumCors::default);
5
6/// CORS 配置,字段为各响应头的简短映射,`None` 表示不输出该响应头。
7#[derive(Debug, Clone, Default)]
8pub struct AxumCors {
9    /// access-control-allow-origin
10    pub origin: Option<String>,
11    /// access-control-allow-methods
12    pub methods: Option<String>,
13    /// access-control-allow-headers
14    pub headers: Option<String>,
15    /// access-control-expose-headers
16    pub expose: Option<String>,
17    /// access-control-allow-credentials
18    pub credentials: Option<String>,
19    /// access-control-max-age
20    pub max_age: Option<String>,
21}
22
23impl AxumCors {
24    /// 懒加载的固定值:不输出任何 CORS 响应头,即拒绝跨域。
25    pub fn fixed() -> &'static Self {
26        &FIXED
27    }
28
29    /// 将配置写入响应头。
30    pub fn apply(&self, headers: &mut MultiStringValue) {
31        let items = [
32            ("access-control-allow-origin", &self.origin),
33            ("access-control-allow-methods", &self.methods),
34            ("access-control-allow-headers", &self.headers),
35            ("access-control-expose-headers", &self.expose),
36            ("access-control-allow-credentials", &self.credentials),
37            ("access-control-max-age", &self.max_age),
38        ];
39        for (name, value) in items {
40            if let Some(value) = value {
41                headers.set(name, value);
42            }
43        }
44    }
45}