satex_layer/cors/
mod.rs

1#![doc = include_str!("../../docs/cors.md")]
2
3mod value;
4
5use crate::cors::value::Value;
6use crate::make::MakeRouteLayer;
7use http::{HeaderName, HeaderValue, Method};
8use satex_core::component::{Args, Configurable};
9use satex_core::Error;
10use satex_macro::make;
11use std::time::Duration;
12use tower_http::cors::CorsLayer;
13
14#[make(kind = "Cors", shortcut_mode = "Unsupported")]
15struct MakeCorsRouteLayer {
16    max_age_secs: Option<u64>,
17    allow_credentials: Option<bool>,
18    allow_private_network: Option<bool>,
19    #[serde(default)]
20    allow_headers: Value<HeaderName>,
21    #[serde(default)]
22    allow_methods: Value<Method>,
23    #[serde(default)]
24    allow_origin: Value<HeaderValue>,
25    #[serde(default)]
26    expose_headers: Value<HeaderName>,
27    #[serde(default)]
28    vary: Value<HeaderName>,
29}
30
31impl MakeRouteLayer for MakeCorsRouteLayer {
32    type Layer = CorsLayer;
33
34    fn make(&self, args: Args) -> Result<Self::Layer, Error> {
35        let config = Config::with_args(args)?;
36        let mut layer = CorsLayer::default()
37            .allow_headers(config.allow_headers)
38            .allow_origin(config.allow_origin)
39            .allow_methods(config.allow_methods)
40            .expose_headers(config.expose_headers)
41            .vary(config.vary);
42
43        if let Some(allow_credentials) = config.allow_credentials {
44            layer = layer.allow_credentials(allow_credentials);
45        }
46        if let Some(max_age_secs) = config.max_age_secs {
47            layer = layer.max_age(Duration::from_secs(max_age_secs));
48        }
49        if let Some(allow_private_network) = config.allow_private_network {
50            layer = layer.allow_private_network(allow_private_network);
51        }
52
53        Ok(layer)
54    }
55}