use axum::http::{HeaderName, HeaderValue, Method};
use tower_http::cors::{AllowOrigin, Any, CorsLayer};
pub struct CorsConfig<'a> {
pub allow_origin: &'a str,
pub allow_methods: Vec<Method>,
pub allow_headers: Vec<HeaderName>,
}
pub fn cors(config: CorsConfig) -> CorsLayer {
let allow_origin = config.allow_origin;
let layer = CorsLayer::new()
.allow_methods(config.allow_methods)
.allow_headers(config.allow_headers);
if allow_origin == "*" {
layer.allow_origin(Any)
} else {
let origins = allow_origin
.split(',')
.filter(|url| *url != "*" && !url.is_empty())
.filter_map(|url| url.parse().ok())
.collect::<Vec<HeaderValue>>();
if origins.is_empty() {
layer.allow_origin(Any)
} else {
layer
.allow_origin(AllowOrigin::predicate(move |origin: &HeaderValue, _| {
origins.contains(origin)
}))
.allow_credentials(true)
}
}
}