Added another variant of origin check in cors layer. pt 2

This commit is contained in:
clowzed 2023-11-09 00:06:45 +03:00
parent 9265cb5085
commit 9be81978cc

View file

@ -6,7 +6,6 @@ use axum::{
routing::{get, post}, routing::{get, post},
Router, Router,
}; };
use futures::executor::block_on;
use extractors::SubdomainModel; use extractors::SubdomainModel;
use services::cors::CorsService; use services::cors::CorsService;
@ -72,43 +71,40 @@ async fn main() {
CorsLayer::new() CorsLayer::new()
.allow_methods(AllowMethods::any()) .allow_methods(AllowMethods::any())
.allow_headers(AllowHeaders::any()) .allow_headers(AllowHeaders::any())
.allow_origin(AllowOrigin::predicate(move |origin, parts| { .allow_origin(AllowOrigin::predicate(move |origin, parts| {let cloned_headers = parts.headers.clone();
let cloned_state = cloned_state.clone(); let (tx, rx) = mpsc::channel();
let cloned_origin = origin
.clone() let cloned_state = cloned_state.clone();
.to_str() let cloned_origin = origin.to_owned().to_str().map(|s| s.to_string()).unwrap_or_default();
.map(|s| s.to_string())
.unwrap_or_default(); std::thread::spawn(move || {
let cloned_headers = parts.headers.clone(); let rt = tokio::runtime::Runtime::new().unwrap();
let (tx, rx) = mpsc::channel(); rt.block_on(async move {
tracing::info!("Starting cors!");
std::thread::spawn( let subdomain_model_extractor =
move || block_on(async move {
tracing::info!("Starting cors!");
let subdomain_model_extractor =
SubdomainModel::from_headers(&cloned_headers, &cloned_state) SubdomainModel::from_headers(&cloned_headers, &cloned_state)
.await .await
.map_err(|cause| { .map_err(|cause| {
tracing::error!(%cause, "Failed to extract subdomain model from headers for cors!"); tracing::error!(%cause, "Failed to extract subdomain model from headers for cors!");
}); });
if subdomain_model_extractor.is_err() { if subdomain_model_extractor.is_err() {
tx.send(false).ok(); tx.send(false).ok();
return; return;
}
let res = CorsService::check(
subdomain_model_extractor.unwrap().0,
&cloned_origin,
&cloned_state.connection,
)
.await
.unwrap_or(false);
tx.send(res).ok();
} }
));
let res = CorsService::check(
rx.recv().unwrap_or(false) subdomain_model_extractor.unwrap().0,
&cloned_origin,
&cloned_state.connection,
)
.await
.unwrap_or(false);
tx.send(res).ok();
});
});
rx.recv().unwrap_or(false)
})) }))
) )
.with_state(state.clone()); .with_state(state.clone());