From f16432cb2a9eb40db52273c0d84994d0d9378124 Mon Sep 17 00:00:00 2001 From: clowzed Date: Sun, 12 Nov 2023 18:48:11 +0300 Subject: [PATCH] finished cors. Untested. Not enabled --- src/main.rs | 87 ++++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/src/main.rs b/src/main.rs index fbed252..ee833f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -63,50 +63,55 @@ async fn main() { let cloned_state = state.clone(); + let cors_layer = CorsLayer::new() + .allow_methods(AllowMethods::any()) + .allow_headers(AllowHeaders::any()) + .allow_origin(AllowOrigin::predicate(move |origin, parts| { + let cloned_headers = parts.headers.clone(); + let (tx, rx) = mpsc::channel(); + + let cloned_state = cloned_state.clone(); + let cloned_origin = origin + .to_owned() + .to_str() + .map(|s| s.to_string()) + .unwrap_or_default(); + + std::thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().unwrap(); + rt.block_on(async move { + tracing::info!("Starting cors!"); + let subdomain_model_extractor = + SubdomainModel::from_headers(&cloned_headers, &cloned_state) + .await + .map_err(|cause| { + tracing::error!(%cause, + "Failed to extract subdomain model from headers for cors!"); + }); + if subdomain_model_extractor.is_err() { + tx.send(false).ok(); + return; + } + + let res = CorsService::check( + subdomain_model_extractor.unwrap().0, + &cloned_origin, + &cloned_state.connection, + ) + .await + .unwrap_or(false); + + tx.send(res).ok(); + }); + }); + + rx.recv().unwrap_or(false) + })); + let mut app = Router::new() .nest("/api", api_router) .route("/*path", get(handlers::sites::file)) - .route("/", get(handlers::sites::index_redirect)) - .layer( - CorsLayer::new() - .allow_methods(AllowMethods::any()) - .allow_headers(AllowHeaders::any()) - .allow_origin(AllowOrigin::predicate(move |origin, parts| {let cloned_headers = parts.headers.clone(); - let (tx, rx) = mpsc::channel(); - - let cloned_state = cloned_state.clone(); - let cloned_origin = origin.to_owned().to_str().map(|s| s.to_string()).unwrap_or_default(); - - std::thread::spawn(move || { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async move { - tracing::info!("Starting cors!"); - let subdomain_model_extractor = - SubdomainModel::from_headers(&cloned_headers, &cloned_state) - .await - .map_err(|cause| { - tracing::error!(%cause, "Failed to extract subdomain model from headers for cors!"); - }); - if subdomain_model_extractor.is_err() { - tx.send(false).ok(); - return; - } - - let res = CorsService::check( - subdomain_model_extractor.unwrap().0, - &cloned_origin, - &cloned_state.connection, - ) - .await - .unwrap_or(false); - - tx.send(res).ok(); - }); - }); - - rx.recv().unwrap_or(false) - })) - ) + .route("/", get(handlers::sites::index_redirect)) .with_state(state.clone()); if config.max_body_limit_size.is_some() {