From c60a34cc8ee94b56cebd7466fd7f07ec25b17d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=A2=A7=E8=97=A4?= <2957035701@qq.com> Date: Fri, 17 May 2024 14:52:33 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=80=E5=A0=86=E4=B9=8B=E5=89=8D=E5=90=88=E5=B9=B6=E8=AF=AF?= =?UTF-8?q?=E5=88=A0=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 01ca87b4..3ff94b47 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,13 +28,18 @@ use configs::{ }; use figment::providers::{Env, Format, Json, Toml, Yaml}; use general_request_client::axum_starter::RequestClientPrepare; +use http::Method; use mob_push_server::axum_starter::MobPushPrepare; use qq_channel_warning::QqChannelPrepare; use request_clients::bili_client::BiliClientPrepare; use scheduler_notifier::axum_starter::ScheduleNotifierPrepare; -use tower_http::compression::CompressionLayer; +use tower_http::{ + catch_panic::CatchPanicLayer, compression::CompressionLayer, + cors::CorsLayer, +}; use tracing_unwrap::ResultExt; +use crate::error::serve_panic; use crate::bootstrap::decorator::Decroator; mod bootstrap; @@ -46,6 +51,12 @@ mod router; mod serves; mod utils; +#[cfg(not(target_env = "msvc"))] use jemallocator::Jemalloc; + +#[cfg(not(target_env = "msvc"))] +#[global_allocator] +static GLOBAL: Jemalloc = Jemalloc; + fn main() { let rt = tokio::runtime::Runtime::new().expect("Init Rt failure"); #[cfg(debug_assertions)] @@ -88,9 +99,14 @@ async fn main_task() { // router .prepare_route(RouteV1) .prepare_route(RouterFallback) + .layer(CorsLayer::new().allow_methods([Method::GET]).allow_origin([ + "https://www.ceobecanteen.top".parse().unwrap(), + "https://ceobecanteen.top".parse().unwrap(), + ])) .prepare_middleware::( PrepareCatchPanic::<_, QqChannelConfig>, ) + .layer(CatchPanicLayer::custom(serve_panic)) .layer(CompressionLayer::new()) .prepare_middleware::(PrepareRequestTracker) .graceful_shutdown(graceful_shutdown()) From 8b26067456fc92c0b1f87db87f5cd3e4aee82616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=A2=A7=E8=97=A4?= <2957035701@qq.com> Date: Fri, 17 May 2024 15:01:07 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=F0=9F=8E=A8=20cargo=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3ff94b47..06ea6caf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,8 +39,7 @@ use tower_http::{ }; use tracing_unwrap::ResultExt; -use crate::error::serve_panic; -use crate::bootstrap::decorator::Decroator; +use crate::{bootstrap::decorator::Decroator, error::serve_panic}; mod bootstrap; mod configs; From 4e35faa3047884aa6f6ae462d1cbe6d4b1cf577b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=A2=A7=E8=97=A4?= <2957035701@qq.com> Date: Fri, 17 May 2024 15:22:12 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20=E5=8D=87=E7=BA=A7ch?= =?UTF-8?q?ecker=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/checker.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/checker.yaml b/.github/workflows/checker.yaml index fe9b48e9..064a5666 100644 --- a/.github/workflows/checker.yaml +++ b/.github/workflows/checker.yaml @@ -21,7 +21,7 @@ jobs: - name: Rust toolchain Stable uses: actions-rs/toolchain@v1 with: - toolchain: 1.77.0 + toolchain: 1.78.0 components: clippy default: true - name: Rust toolchain Nightly From f512edb063dccbaa645cc4b3743085d728114ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=A2=A7=E8=97=A4?= <2957035701@qq.com> Date: Fri, 17 May 2024 15:22:25 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=F0=9F=8E=A8=20cargo=20clippy=20&=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/range-limit/src/range_limit/serde.rs | 3 +++ libs/status-err/src/lib.rs | 2 +- logic/ceobe_cookie_logic/src/view.rs | 5 +---- logic/fetcher_logic/src/utils.rs | 2 ++ logic/fetcher_logic/src/view.rs | 5 +---- .../dao/ceobe-operate/src/sql/announcement/retrieve.rs | 4 ++-- src/utils/field_with_struct_trait.rs | 3 ++- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libs/range-limit/src/range_limit/serde.rs b/libs/range-limit/src/range_limit/serde.rs index de602186..f9bbe095 100644 --- a/libs/range-limit/src/range_limit/serde.rs +++ b/libs/range-limit/src/range_limit/serde.rs @@ -4,11 +4,13 @@ use serde::{de, Serialize}; use crate::{measurable::Measurable, RangeBound, RangeBoundLimit}; +#[allow(dead_code)] trait SerdeProc { type ToSerde: Measurable + serde::Serialize; fn to_serde(&self) -> &Self::ToSerde; } +#[allow(dead_code)] struct Normal(T); impl SerdeProc for Normal { @@ -17,6 +19,7 @@ impl SerdeProc for Normal { fn to_serde(&self) -> &Self::ToSerde { &self.0 } } +#[allow(dead_code)] struct SmartPtr(P) where P: Deref; diff --git a/libs/status-err/src/lib.rs b/libs/status-err/src/lib.rs index 0a42ef68..af5b5de8 100644 --- a/libs/status-err/src/lib.rs +++ b/libs/status-err/src/lib.rs @@ -18,7 +18,7 @@ pub trait StatusErr: std::error::Error { fn prefix(&self) -> ErrPrefix; fn code(&self) -> u16; - /// + fn status(&self) -> status_code::StatusCode { status_code::StatusCode::new(self.prefix(), self.code()) } diff --git a/logic/ceobe_cookie_logic/src/view.rs b/logic/ceobe_cookie_logic/src/view.rs index 4ed93dd3..33bc4a9b 100644 --- a/logic/ceobe_cookie_logic/src/view.rs +++ b/logic/ceobe_cookie_logic/src/view.rs @@ -83,10 +83,7 @@ pub struct CookieContentReq { fn empty_change_to_none<'de, D: Deserializer<'de>>( d: D, -) -> Result, D::Error> -where - D: Deserializer<'de>, -{ +) -> Result, D::Error> { let value = Option::::deserialize(d)?; Ok(match value.as_deref() { Some("") | None => None, diff --git a/logic/fetcher_logic/src/utils.rs b/logic/fetcher_logic/src/utils.rs index 967283f3..9093f0de 100644 --- a/logic/fetcher_logic/src/utils.rs +++ b/logic/fetcher_logic/src/utils.rs @@ -10,10 +10,12 @@ use std::{ }; pub(super) trait GetOrCreate { + #[allow(dead_code)] fn get_mut_or_create(&mut self, key: K, value: V) -> &mut V; fn get_mut_or_default(&mut self, key: K) -> &mut V where V: Default; + #[allow(dead_code)] fn get_mut_or_create_with V>( &mut self, key: K, default: F, ) -> &mut V; diff --git a/logic/fetcher_logic/src/view.rs b/logic/fetcher_logic/src/view.rs index 64789e9b..7eace3e8 100644 --- a/logic/fetcher_logic/src/view.rs +++ b/logic/fetcher_logic/src/view.rs @@ -183,10 +183,7 @@ impl From for DatasourceWithNameResp { fn empty_change_to_none<'de, D: Deserializer<'de>>( d: D, -) -> Result, D::Error> -where - D: Deserializer<'de>, -{ +) -> Result, D::Error> { let value = Option::::deserialize(d)?; Ok(match value.as_deref() { Some("") | None => None, diff --git a/persistence/dao/ceobe-operate/src/sql/announcement/retrieve.rs b/persistence/dao/ceobe-operate/src/sql/announcement/retrieve.rs index 0a38be5b..d768428c 100644 --- a/persistence/dao/ceobe-operate/src/sql/announcement/retrieve.rs +++ b/persistence/dao/ceobe-operate/src/sql/announcement/retrieve.rs @@ -18,7 +18,7 @@ use super::{AnnouncementOperate, Column, Entity, Model, OperateResult}; impl AnnouncementOperate<'_, NoConnect> { pub async fn find_by_filter_raw<'s, 'db: 's>( filter: impl IntoCondition, - db: &'db (impl ConnectionTrait + StreamTrait + Send + 's), + db: &'db (impl ConnectionTrait + StreamTrait + 's), ) -> OperateResult> + Send + 's> { Ok(Entity::find() @@ -30,7 +30,7 @@ impl AnnouncementOperate<'_, NoConnect> { pub async fn find_by_filter_not_delete_raw<'s, 'db: 's>( filter: impl IntoCondition, - db: &'db (impl ConnectionTrait + StreamTrait + Send + 's), + db: &'db (impl ConnectionTrait + StreamTrait + 's), ) -> OperateResult> + Send + 's> { Self::find_by_filter_raw( diff --git a/src/utils/field_with_struct_trait.rs b/src/utils/field_with_struct_trait.rs index a67e6e22..0dcf823b 100644 --- a/src/utils/field_with_struct_trait.rs +++ b/src/utils/field_with_struct_trait.rs @@ -76,13 +76,14 @@ macro_rules! trait_field { } quick_trait! { + #[allow(dead_code)] pub Mock{ trait_field!{*max_size:u32} trait_field!{*port: u16 = 3360} trait_field!{host: & 'static str} trait_field!{host2: u32 = &11} } - + #[allow(dead_code)] pub Next{ } From ed67f2a42fd0ab7083809d4ca4cc7b534c4f031e Mon Sep 17 00:00:00 2001 From: FrozenString <964413011@qq.com> Date: Fri, 17 May 2024 15:58:07 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/range-limit/src/range_limit/serde.rs | 38 +--------- logic/fetcher_logic/src/utils.rs | 4 + src/main.rs | 10 +-- src/utils/field_with_struct_trait.rs | 90 ----------------------- src/utils/mob_verify/mod.rs | 7 +- src/utils/mod.rs | 1 - src/utils/user_authorize/config.rs | 8 +- 7 files changed, 18 insertions(+), 140 deletions(-) delete mode 100644 src/utils/field_with_struct_trait.rs diff --git a/libs/range-limit/src/range_limit/serde.rs b/libs/range-limit/src/range_limit/serde.rs index f9bbe095..4d2eb550 100644 --- a/libs/range-limit/src/range_limit/serde.rs +++ b/libs/range-limit/src/range_limit/serde.rs @@ -1,40 +1,10 @@ -use std::ops::Deref; -use serde::{de, Serialize}; +use serde::{de, Deserialize, Serialize}; use crate::{measurable::Measurable, RangeBound, RangeBoundLimit}; -#[allow(dead_code)] -trait SerdeProc { - type ToSerde: Measurable + serde::Serialize; - fn to_serde(&self) -> &Self::ToSerde; -} - -#[allow(dead_code)] -struct Normal(T); - -impl SerdeProc for Normal { - type ToSerde = T; - - fn to_serde(&self) -> &Self::ToSerde { &self.0 } -} - -#[allow(dead_code)] -struct SmartPtr(P) -where - P: Deref; - -impl SerdeProc for SmartPtr -where - P: Deref, - T: Measurable + Serialize, -{ - type ToSerde = T; - - fn to_serde(&self) -> &Self::ToSerde { self.0.deref() } -} -impl serde::Serialize for RangeBoundLimit { +impl Serialize for RangeBoundLimit { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, @@ -43,9 +13,9 @@ impl serde::Serialize for RangeBoundLimit { } } -impl<'de, T, Rb> serde::Deserialize<'de> for RangeBoundLimit +impl<'de, T, Rb> Deserialize<'de> for RangeBoundLimit where - T: serde::Deserialize<'de> + Measurable, + T: Deserialize<'de> + Measurable, Rb: RangeBound, { fn deserialize(deserializer: D) -> Result diff --git a/logic/fetcher_logic/src/utils.rs b/logic/fetcher_logic/src/utils.rs index 9093f0de..712151b9 100644 --- a/logic/fetcher_logic/src/utils.rs +++ b/logic/fetcher_logic/src/utils.rs @@ -10,15 +10,19 @@ use std::{ }; pub(super) trait GetOrCreate { + #[allow(dead_code)] fn get_mut_or_create(&mut self, key: K, value: V) -> &mut V; + fn get_mut_or_default(&mut self, key: K) -> &mut V where V: Default; + #[allow(dead_code)] fn get_mut_or_create_with V>( &mut self, key: K, default: F, ) -> &mut V; + fn get_mut_or_try_create_with Result, E>( &mut self, key: K, default: F, ) -> Result<&mut V, E>; diff --git a/src/main.rs b/src/main.rs index 06ea6caf..670f8ab4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,11 +50,10 @@ mod router; mod serves; mod utils; -#[cfg(not(target_env = "msvc"))] use jemallocator::Jemalloc; #[cfg(not(target_env = "msvc"))] #[global_allocator] -static GLOBAL: Jemalloc = Jemalloc; +static GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc; fn main() { let rt = tokio::runtime::Runtime::new().expect("Init Rt failure"); @@ -98,14 +97,13 @@ async fn main_task() { // router .prepare_route(RouteV1) .prepare_route(RouterFallback) + .prepare_middleware::( + PrepareCatchPanic::<_, QqChannelConfig>, + ) .layer(CorsLayer::new().allow_methods([Method::GET]).allow_origin([ "https://www.ceobecanteen.top".parse().unwrap(), "https://ceobecanteen.top".parse().unwrap(), ])) - .prepare_middleware::( - PrepareCatchPanic::<_, QqChannelConfig>, - ) - .layer(CatchPanicLayer::custom(serve_panic)) .layer(CompressionLayer::new()) .prepare_middleware::(PrepareRequestTracker) .graceful_shutdown(graceful_shutdown()) diff --git a/src/utils/field_with_struct_trait.rs b/src/utils/field_with_struct_trait.rs deleted file mode 100644 index 0dcf823b..00000000 --- a/src/utils/field_with_struct_trait.rs +++ /dev/null @@ -1,90 +0,0 @@ -/// 构造一个可以产生特定域的结构体特征 -/// -/// ##example -/// ```rust -/// quick_trait! { -/// pub Mock{ -/// // 在字段前使用 `*` 将会标记函数返回所有权而不是引用 -/// // 以下将生成 `fn max_size(&self)->u32;` -/// trait_field!{*max_size:u32} -/// // 在类型后面 使用 `=` 提供默认实现 -/// trait_field!{*port: u16 = 3360} -/// // 字段前不前缀`*` 接口将返回引用类型 -/// // 以下将生成 `fn host(&self)->&& 'static str;` -/// trait_field!{host: & 'static str} -/// // 同样可以指定默认值 -/// trait_field!{host2: u32 = &11} -/// } -/// } -/// ``` - -#[macro_export] -macro_rules! quick_trait { - { - - $(#[$m:meta])* - $v:vis $name:ident{ - $( - $t:tt - )* - } - } => { - $(#[$m])* - $v trait $name{ - $( - $t - )* - } - }; - - {$( - $(#[$m:meta])* - $v:vis $name:ident{ - $( - $t:tt - )* - })*}=>{ - $( - $crate::quick_trait!{ - $(#[$m])* - $v $name { - $( - $t - )* - } - } - )* - } -} -/// 为 [quick_trait] 提供trait 接口构造信息 -#[macro_export] -macro_rules! trait_field { - {$f:ident : $t:ty} => { - fn $f(&self) -> &$t; - }; - {$f:ident : $t:ty = $e:expr} => { - #[inline] - fn $f(&self) -> &$t { $e } - }; - {*$f:ident : $t:ty} => { - fn $f(&self) -> $t; - }; - {*$f:ident : $t:ty = $e:expr} => { - #[inline] - fn $f(&self) -> $t { $e } - }; -} - -quick_trait! { - #[allow(dead_code)] - pub Mock{ - trait_field!{*max_size:u32} - trait_field!{*port: u16 = 3360} - trait_field!{host: & 'static str} - trait_field!{host2: u32 = &11} - } - #[allow(dead_code)] - pub Next{ - - } -} diff --git a/src/utils/mob_verify/mod.rs b/src/utils/mob_verify/mod.rs index 0495f798..fc9fb762 100644 --- a/src/utils/mob_verify/mod.rs +++ b/src/utils/mob_verify/mod.rs @@ -5,11 +5,10 @@ use http::Request; use once_cell::sync::OnceCell; use tracing::warn; -crate::quick_trait! { - pub MobIdConfig{ - crate::trait_field!{*mob_header:String=String::from("mob-id")} + pub trait MobIdConfig{ + fn mob_header(&self)->String{String::from("mob-id")} } -} + static LOCAL_CONFIG: OnceCell = OnceCell::new(); struct LocalMobIdConfig { diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 8ce1c6d2..ee7de4e5 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,5 +1,4 @@ pub mod data_struct; -pub mod field_with_struct_trait; pub mod mob_verify; pub mod quick_struct; pub mod time_format; diff --git a/src/utils/user_authorize/config.rs b/src/utils/user_authorize/config.rs index 26d96bec..f6125c7b 100644 --- a/src/utils/user_authorize/config.rs +++ b/src/utils/user_authorize/config.rs @@ -7,12 +7,10 @@ use once_cell::sync::OnceCell; use sha2::Sha256; use tracing::warn; -crate::quick_trait! { - pub AuthConfig{ - crate::trait_field!{*jwt_key:&[u8]} - crate::trait_field!{*token_header:String=String::from("Token")} + pub trait AuthConfig{ + fn jwt_key(&self)->&[u8]; + fn token_header(&self)->String{String::from("Token")} } -} static LOCAL_CONFIG: OnceCell = OnceCell::new(); struct LocalAuthConfig { From 6010dd863e0f9d6aa6a0124189d0084902cce6d7 Mon Sep 17 00:00:00 2001 From: FrozenString <964413011@qq.com> Date: Fri, 17 May 2024 16:11:59 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=F0=9F=8E=A8=20cargo=20fmt=20&=20clippy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/range-limit/src/range_limit/serde.rs | 2 -- logic/fetcher_logic/src/utils.rs | 1 - src/main.rs | 14 +++++--------- src/utils/mob_verify/mod.rs | 6 +++--- src/utils/user_authorize/config.rs | 8 ++++---- 5 files changed, 12 insertions(+), 19 deletions(-) diff --git a/libs/range-limit/src/range_limit/serde.rs b/libs/range-limit/src/range_limit/serde.rs index 4d2eb550..a7e32581 100644 --- a/libs/range-limit/src/range_limit/serde.rs +++ b/libs/range-limit/src/range_limit/serde.rs @@ -1,9 +1,7 @@ - use serde::{de, Deserialize, Serialize}; use crate::{measurable::Measurable, RangeBound, RangeBoundLimit}; - impl Serialize for RangeBoundLimit { fn serialize(&self, serializer: S) -> Result where diff --git a/logic/fetcher_logic/src/utils.rs b/logic/fetcher_logic/src/utils.rs index 712151b9..7625cf29 100644 --- a/logic/fetcher_logic/src/utils.rs +++ b/logic/fetcher_logic/src/utils.rs @@ -10,7 +10,6 @@ use std::{ }; pub(super) trait GetOrCreate { - #[allow(dead_code)] fn get_mut_or_create(&mut self, key: K, value: V) -> &mut V; diff --git a/src/main.rs b/src/main.rs index 670f8ab4..7bd20ad6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,13 +33,10 @@ use mob_push_server::axum_starter::MobPushPrepare; use qq_channel_warning::QqChannelPrepare; use request_clients::bili_client::BiliClientPrepare; use scheduler_notifier::axum_starter::ScheduleNotifierPrepare; -use tower_http::{ - catch_panic::CatchPanicLayer, compression::CompressionLayer, - cors::CorsLayer, -}; +use tower_http::{compression::CompressionLayer, cors::CorsLayer}; use tracing_unwrap::ResultExt; -use crate::{bootstrap::decorator::Decroator, error::serve_panic}; +use crate::bootstrap::decorator::Decroator; mod bootstrap; mod configs; @@ -50,7 +47,6 @@ mod router; mod serves; mod utils; - #[cfg(not(target_env = "msvc"))] #[global_allocator] static GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc; @@ -97,13 +93,13 @@ async fn main_task() { // router .prepare_route(RouteV1) .prepare_route(RouterFallback) - .prepare_middleware::( - PrepareCatchPanic::<_, QqChannelConfig>, - ) .layer(CorsLayer::new().allow_methods([Method::GET]).allow_origin([ "https://www.ceobecanteen.top".parse().unwrap(), "https://ceobecanteen.top".parse().unwrap(), ])) + .prepare_middleware::( + PrepareCatchPanic::<_, QqChannelConfig>, + ) .layer(CompressionLayer::new()) .prepare_middleware::(PrepareRequestTracker) .graceful_shutdown(graceful_shutdown()) diff --git a/src/utils/mob_verify/mod.rs b/src/utils/mob_verify/mod.rs index fc9fb762..8e710803 100644 --- a/src/utils/mob_verify/mod.rs +++ b/src/utils/mob_verify/mod.rs @@ -5,9 +5,9 @@ use http::Request; use once_cell::sync::OnceCell; use tracing::warn; - pub trait MobIdConfig{ - fn mob_header(&self)->String{String::from("mob-id")} - } +pub trait MobIdConfig { + fn mob_header(&self) -> String { String::from("mob-id") } +} static LOCAL_CONFIG: OnceCell = OnceCell::new(); diff --git a/src/utils/user_authorize/config.rs b/src/utils/user_authorize/config.rs index f6125c7b..14bfa38f 100644 --- a/src/utils/user_authorize/config.rs +++ b/src/utils/user_authorize/config.rs @@ -7,10 +7,10 @@ use once_cell::sync::OnceCell; use sha2::Sha256; use tracing::warn; - pub trait AuthConfig{ - fn jwt_key(&self)->&[u8]; - fn token_header(&self)->String{String::from("Token")} - } +pub trait AuthConfig { + fn jwt_key(&self) -> &[u8]; + fn token_header(&self) -> String { String::from("Token") } +} static LOCAL_CONFIG: OnceCell = OnceCell::new(); struct LocalAuthConfig { From 3ac5b48100291489c0bda5cd41ed4df2beeb3c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=A2=A7=E8=97=A4?= <2957035701@qq.com> Date: Fri, 17 May 2024 16:57:46 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E8=B7=A8=E5=9F=9F?= =?UTF-8?q?=E9=87=87=E7=94=A8=E4=B8=AD=E9=97=B4=E4=BB=B6=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bootstrap/middleware/cors.rs | 35 ++++++++++++++++++++++++++++++++ src/bootstrap/middleware/mod.rs | 1 + src/configs/cors_config.rs | 35 ++++++++++++++++++++++++++++++++ src/configs/mod.rs | 3 +++ src/main.rs | 15 +++++--------- 5 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 src/bootstrap/middleware/cors.rs create mode 100644 src/configs/cors_config.rs diff --git a/src/bootstrap/middleware/cors.rs b/src/bootstrap/middleware/cors.rs new file mode 100644 index 00000000..d94d7a14 --- /dev/null +++ b/src/bootstrap/middleware/cors.rs @@ -0,0 +1,35 @@ +use axum_starter::{prepare, PrepareMiddlewareEffect}; +use http::{HeaderValue, Method}; +use tower_http::cors::CorsLayer; + +pub trait CorsConfigTrait { + fn allow_origins(&self) -> Vec; + + fn allow_methods(&self) -> Vec; +} + +pub struct CorsConfig { + origins: Vec, + methods: Vec, +} + +#[prepare(PrepareCors)] +pub fn prepare_cors(cfg: &T) -> CorsMiddleware { + let config = CorsConfig { + origins: cfg.allow_origins(), + methods: cfg.allow_methods(), + }; + CorsMiddleware(config) +} + +pub struct CorsMiddleware(CorsConfig); + +impl PrepareMiddlewareEffect for CorsMiddleware { + type Middleware = CorsLayer; + + fn take(self, _: &mut axum_starter::StateCollector) -> Self::Middleware { + CorsLayer::new() + .allow_origin(self.0.origins) + .allow_methods(self.0.methods) + } +} diff --git a/src/bootstrap/middleware/mod.rs b/src/bootstrap/middleware/mod.rs index 170b7b1c..4f954fc1 100644 --- a/src/bootstrap/middleware/mod.rs +++ b/src/bootstrap/middleware/mod.rs @@ -1,2 +1,3 @@ +pub mod cors; pub mod panic_report; pub mod tracing_request; diff --git a/src/configs/cors_config.rs b/src/configs/cors_config.rs new file mode 100644 index 00000000..e9180a43 --- /dev/null +++ b/src/configs/cors_config.rs @@ -0,0 +1,35 @@ +use http::{HeaderValue, Method}; +use serde::{Deserialize, Deserializer}; + +use crate::bootstrap::middleware::cors::CorsConfigTrait; + +#[derive(Deserialize, Debug, Clone, Default)] +pub struct CorsConfigImpl { + #[serde(alias = "origins")] + allow_origins: Vec, + #[serde(alias = "methods", deserialize_with = "de_methods")] + allow_methods: Vec, +} + +impl CorsConfigTrait for CorsConfigImpl { + fn allow_origins(&self) -> Vec { + self.allow_origins + .iter() + .map(|path| path.parse().expect("Bad Origin Value")) + .collect() + } + + fn allow_methods(&self) -> Vec { self.allow_methods.clone() } +} + +fn de_methods<'de, D: Deserializer<'de>>( + de: D, +) -> Result, D::Error> { + let vec = Vec::::deserialize(de)?; + vec.iter() + .map(|method| Method::try_from(method.as_str())) + .try_fold(Vec::with_capacity(vec.len()), |mut vec, value| { + vec.push(value.map_err(serde::de::Error::custom)?); + Ok(vec) + }) +} diff --git a/src/configs/mod.rs b/src/configs/mod.rs index f7ac6c04..6109eeca 100644 --- a/src/configs/mod.rs +++ b/src/configs/mod.rs @@ -16,6 +16,7 @@ use self::{ }; pub mod auth_config; +pub mod cors_config; pub mod first_user; pub mod http_listen_config; pub mod logger; @@ -66,4 +67,6 @@ pub struct GlobalConfig { pub mob_push: mob_config::MobPushConfig, #[serde(alias = "qq")] pub qq_channel: qq_channel::QqChannelConfig, + #[serde(default)] + pub cors: cors_config::CorsConfigImpl, } diff --git a/src/main.rs b/src/main.rs index 06ea6caf..069cbe82 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,28 +14,26 @@ use bootstrap::{ service_init::{graceful_shutdown, RouteV1, RouterFallback}, }, middleware::{ - panic_report::PrepareCatchPanic, + cors::PrepareCors, panic_report::PrepareCatchPanic, tracing_request::PrepareRequestTracker, }, }; use ceobe_qiniu_upload::QiniuUpload; use configs::{ - auth_config::AuthConfig, mob_config::MobPushConfig, - qiniu_secret::QiniuUploadConfig, qq_channel::QqChannelConfig, - resp_result_config::RespResultConfig, + auth_config::AuthConfig, cors_config::CorsConfigImpl, + mob_config::MobPushConfig, qiniu_secret::QiniuUploadConfig, + qq_channel::QqChannelConfig, resp_result_config::RespResultConfig, schedule_notifier_config::ScheduleNotifierConfig, GlobalConfig, CONFIG_FILE_JSON, CONFIG_FILE_TOML, CONFIG_FILE_YAML, }; use figment::providers::{Env, Format, Json, Toml, Yaml}; use general_request_client::axum_starter::RequestClientPrepare; -use http::Method; use mob_push_server::axum_starter::MobPushPrepare; use qq_channel_warning::QqChannelPrepare; use request_clients::bili_client::BiliClientPrepare; use scheduler_notifier::axum_starter::ScheduleNotifierPrepare; use tower_http::{ catch_panic::CatchPanicLayer, compression::CompressionLayer, - cors::CorsLayer, }; use tracing_unwrap::ResultExt; @@ -98,13 +96,10 @@ async fn main_task() { // router .prepare_route(RouteV1) .prepare_route(RouterFallback) - .layer(CorsLayer::new().allow_methods([Method::GET]).allow_origin([ - "https://www.ceobecanteen.top".parse().unwrap(), - "https://ceobecanteen.top".parse().unwrap(), - ])) .prepare_middleware::( PrepareCatchPanic::<_, QqChannelConfig>, ) + .prepare_middleware::(PrepareCors::<_, CorsConfigImpl>) .layer(CatchPanicLayer::custom(serve_panic)) .layer(CompressionLayer::new()) .prepare_middleware::(PrepareRequestTracker) From 8b07cc252f06c409734741907b885cf68d24f81d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=A2=A7=E8=97=A4?= <2957035701@qq.com> Date: Fri, 17 May 2024 19:00:00 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E4=BB=B6=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 9a402d18..6e7172c7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -92,10 +92,10 @@ async fn main_task() { // router .prepare_route(RouteV1) .prepare_route(RouterFallback) + .prepare_middleware::(PrepareCors::<_, CorsConfigImpl>) .prepare_middleware::( PrepareCatchPanic::<_, QqChannelConfig>, ) - .prepare_middleware::(PrepareCors::<_, CorsConfigImpl>) .layer(CompressionLayer::new()) .prepare_middleware::(PrepareRequestTracker) .graceful_shutdown(graceful_shutdown()) From c3629ba9eb5f99feeab6271a18dd5c4dbbc76478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=A2=A7=E8=97=A4?= <2957035701@qq.com> Date: Fri, 17 May 2024 19:48:54 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bootstrap/middleware/cors.rs | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/bootstrap/middleware/cors.rs b/src/bootstrap/middleware/cors.rs index d94d7a14..ccbb9fac 100644 --- a/src/bootstrap/middleware/cors.rs +++ b/src/bootstrap/middleware/cors.rs @@ -8,28 +8,21 @@ pub trait CorsConfigTrait { fn allow_methods(&self) -> Vec; } -pub struct CorsConfig { - origins: Vec, - methods: Vec, -} - #[prepare(PrepareCors)] pub fn prepare_cors(cfg: &T) -> CorsMiddleware { - let config = CorsConfig { - origins: cfg.allow_origins(), - methods: cfg.allow_methods(), - }; - CorsMiddleware(config) + CorsMiddleware( + CorsLayer::new() + .allow_origin(cfg.allow_origins()) + .allow_methods(cfg.allow_methods()), + ) } -pub struct CorsMiddleware(CorsConfig); +pub struct CorsMiddleware(CorsLayer); impl PrepareMiddlewareEffect for CorsMiddleware { type Middleware = CorsLayer; fn take(self, _: &mut axum_starter::StateCollector) -> Self::Middleware { - CorsLayer::new() - .allow_origin(self.0.origins) - .allow_methods(self.0.methods) + self.0 } } From 6e289142f5cda1229c670e86078ff08f6cd36b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=A2=A7=E8=97=A4?= <2957035701@qq.com> Date: Fri, 17 May 2024 20:16:11 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E9=87=8D=E6=9E=84co?= =?UTF-8?q?rs=20origin=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bootstrap/middleware/cors.rs | 3 ++- src/configs/cors_config.rs | 22 ++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/bootstrap/middleware/cors.rs b/src/bootstrap/middleware/cors.rs index ccbb9fac..ed393daa 100644 --- a/src/bootstrap/middleware/cors.rs +++ b/src/bootstrap/middleware/cors.rs @@ -1,6 +1,6 @@ use axum_starter::{prepare, PrepareMiddlewareEffect}; use http::{HeaderValue, Method}; -use tower_http::cors::CorsLayer; +use tower_http::cors::{AllowMethods, CorsLayer}; pub trait CorsConfigTrait { fn allow_origins(&self) -> Vec; @@ -17,6 +17,7 @@ pub fn prepare_cors(cfg: &T) -> CorsMiddleware { ) } + pub struct CorsMiddleware(CorsLayer); impl PrepareMiddlewareEffect for CorsMiddleware { diff --git a/src/configs/cors_config.rs b/src/configs/cors_config.rs index e9180a43..806b8902 100644 --- a/src/configs/cors_config.rs +++ b/src/configs/cors_config.rs @@ -5,23 +5,33 @@ use crate::bootstrap::middleware::cors::CorsConfigTrait; #[derive(Deserialize, Debug, Clone, Default)] pub struct CorsConfigImpl { - #[serde(alias = "origins")] - allow_origins: Vec, + #[serde(alias = "origins", deserialize_with = "de_origins")] + allow_origins: Vec, #[serde(alias = "methods", deserialize_with = "de_methods")] allow_methods: Vec, } impl CorsConfigTrait for CorsConfigImpl { fn allow_origins(&self) -> Vec { - self.allow_origins - .iter() - .map(|path| path.parse().expect("Bad Origin Value")) - .collect() + self.allow_origins.clone() } fn allow_methods(&self) -> Vec { self.allow_methods.clone() } } +fn de_origins<'de, D: Deserializer<'de>>( + de: D, +) -> Result, D::Error> { + let vec = Vec::::deserialize(de)?; + vec + .iter() + .map(|path| path.parse()) + .try_fold(Vec::with_capacity(vec.len()), |mut vec, value| { + vec.push(value.map_err(serde::de::Error::custom)?); + Ok(vec) + }) +} + fn de_methods<'de, D: Deserializer<'de>>( de: D, ) -> Result, D::Error> { From 8648f8883ab135ad2b28eb839badec3445bfd8c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=A2=A7=E8=97=A4?= <2957035701@qq.com> Date: Fri, 17 May 2024 20:20:03 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=F0=9F=8E=A8=20cargo=20clippy=20&=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bootstrap/middleware/cors.rs | 3 +-- src/configs/cors_config.rs | 14 ++++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/bootstrap/middleware/cors.rs b/src/bootstrap/middleware/cors.rs index ed393daa..ccbb9fac 100644 --- a/src/bootstrap/middleware/cors.rs +++ b/src/bootstrap/middleware/cors.rs @@ -1,6 +1,6 @@ use axum_starter::{prepare, PrepareMiddlewareEffect}; use http::{HeaderValue, Method}; -use tower_http::cors::{AllowMethods, CorsLayer}; +use tower_http::cors::CorsLayer; pub trait CorsConfigTrait { fn allow_origins(&self) -> Vec; @@ -17,7 +17,6 @@ pub fn prepare_cors(cfg: &T) -> CorsMiddleware { ) } - pub struct CorsMiddleware(CorsLayer); impl PrepareMiddlewareEffect for CorsMiddleware { diff --git a/src/configs/cors_config.rs b/src/configs/cors_config.rs index 806b8902..da4735c6 100644 --- a/src/configs/cors_config.rs +++ b/src/configs/cors_config.rs @@ -12,9 +12,7 @@ pub struct CorsConfigImpl { } impl CorsConfigTrait for CorsConfigImpl { - fn allow_origins(&self) -> Vec { - self.allow_origins.clone() - } + fn allow_origins(&self) -> Vec { self.allow_origins.clone() } fn allow_methods(&self) -> Vec { self.allow_methods.clone() } } @@ -23,13 +21,13 @@ fn de_origins<'de, D: Deserializer<'de>>( de: D, ) -> Result, D::Error> { let vec = Vec::::deserialize(de)?; - vec - .iter() - .map(|path| path.parse()) - .try_fold(Vec::with_capacity(vec.len()), |mut vec, value| { + vec.iter().map(|path| path.parse()).try_fold( + Vec::with_capacity(vec.len()), + |mut vec, value| { vec.push(value.map_err(serde::de::Error::custom)?); Ok(vec) - }) + }, + ) } fn de_methods<'de, D: Deserializer<'de>>(