From 4444f64ee98f314938a383b4dfdf3cd74fd7e717 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Thu, 6 Apr 2023 07:25:24 +0000 Subject: fix(context): fix async sharing --- src/context/error.rs | 18 +++------ src/context/hook.rs | 17 ++++----- src/context/route.rs | 18 ++++----- src/handler/response/error.rs | 7 +--- src/router.rs | 89 ++++++++++++++++++++----------------------- 5 files changed, 64 insertions(+), 85 deletions(-) (limited to 'src') diff --git a/src/context/error.rs b/src/context/error.rs index eb1e00e..a9a4b85 100644 --- a/src/context/error.rs +++ b/src/context/error.rs @@ -17,24 +17,18 @@ // SPDX-License-Identifier: GPL-3.0-only use openssl::x509::X509; -use tokio::net::TcpStream; use url::Url; #[allow(clippy::module_name_repetitions)] -pub struct ErrorContext<'a> { - pub tcp: &'a TcpStream, - pub url: &'a Url, - pub certificate: &'a Option, +pub struct ErrorContext { + pub url: Url, + pub certificate: Option, } -impl<'a> ErrorContext<'a> { - pub const fn new( - tcp: &'a TcpStream, - url: &'a Url, - certificate: &'a Option, - ) -> Self { +impl ErrorContext { + #[must_use] + pub const fn new(url: Url, certificate: Option) -> Self { Self { - tcp, url, certificate, } diff --git a/src/context/hook.rs b/src/context/hook.rs index 44804fa..736696f 100644 --- a/src/context/hook.rs +++ b/src/context/hook.rs @@ -18,26 +18,23 @@ use matchit::Params; use openssl::x509::X509; -use tokio::net::TcpStream; use url::Url; #[allow(clippy::module_name_repetitions)] pub struct HookContext<'a> { - pub tcp: &'a TcpStream, - pub url: &'a Url, - pub params: Option<&'a Params<'a, 'a>>, - pub certificate: &'a Option, + pub url: Url, + pub params: Option>, + pub certificate: Option, } impl<'a> HookContext<'a> { + #[must_use] pub const fn new( - tcp: &'a TcpStream, - url: &'a Url, - params: Option<&'a Params<'a, 'a>>, - certificate: &'a Option, + url: Url, + params: Option>, + certificate: Option, ) -> Self { Self { - tcp, url, params, certificate, diff --git a/src/context/route.rs b/src/context/route.rs index 61eca0c..b3b105d 100644 --- a/src/context/route.rs +++ b/src/context/route.rs @@ -18,26 +18,24 @@ use matchit::Params; use openssl::x509::X509; -use tokio::net::TcpStream; use url::Url; #[allow(clippy::module_name_repetitions)] +#[derive(Clone)] pub struct RouteContext<'a> { - pub tcp: &'a TcpStream, - pub url: &'a Url, - pub params: &'a Params<'a, 'a>, - pub certificate: &'a Option, + pub url: Url, + pub params: Params<'a, 'a>, + pub certificate: Option, } impl<'a> RouteContext<'a> { + #[must_use] pub const fn new( - tcp: &'a TcpStream, - url: &'a Url, - params: &'a Params<'a, 'a>, - certificate: &'a Option, + url: Url, + params: Params<'a, 'a>, + certificate: Option, ) -> Self { Self { - tcp, url, params, certificate, diff --git a/src/handler/response/error.rs b/src/handler/response/error.rs index da57898..c433a46 100644 --- a/src/handler/response/error.rs +++ b/src/handler/response/error.rs @@ -19,10 +19,7 @@ use crate::{context::ErrorContext, Response}; #[allow(clippy::module_name_repetitions)] -pub trait ErrorResponse: - FnMut(ErrorContext<'_>) -> Response + Send + Sync -{ -} +pub trait ErrorResponse: FnMut(ErrorContext) -> Response + Send + Sync {} -impl ErrorResponse for T where T: FnMut(ErrorContext<'_>) -> Response + Send + Sync +impl ErrorResponse for T where T: FnMut(ErrorContext) -> Response + Send + Sync {} diff --git a/src/router.rs b/src/router.rs index 4b13f8d..b4cd0c7 100644 --- a/src/router.rs +++ b/src/router.rs @@ -348,44 +348,45 @@ impl Router { for module in &mut *self.async_modules.lock().await { module .on_pre_route(HookContext::new( - stream.get_ref(), - &url, - route.as_ref().map_or(None, |route| Some(&route.params)), - &stream.ssl().peer_certificate(), + url.clone(), + route + .as_ref() + .map_or(None, |route| Some(route.params.clone())), + stream.ssl().peer_certificate().clone(), )) .await; } for module in &mut *self.modules.lock().unwrap() { module.on_pre_route(HookContext::new( - stream.get_ref(), - &url, - route.as_ref().map_or(None, |route| Some(&route.params)), - &stream.ssl().peer_certificate(), + url.clone(), + route + .as_ref() + .map_or(None, |route| Some(route.params.clone())), + stream.ssl().peer_certificate().clone(), )); } (*self.pre_route_callback).lock().unwrap()(HookContext::new( - stream.get_ref(), - &url, - route.as_ref().map_or(None, |route| Some(&route.params)), - &stream.ssl().peer_certificate(), + url.clone(), + route + .as_ref() + .map_or(None, |route| Some(route.params.clone())), + stream.ssl().peer_certificate(), )); let peer_certificate = stream.ssl().peer_certificate(); let mut content = if let Ok(ref route) = route { let footers_length = (*self.footers.lock().unwrap()).len(); + let route_context = RouteContext::new( + url.clone(), + route.params.clone(), + stream.ssl().peer_certificate(), + ); for partial_header in &mut *self.headers.lock().unwrap() { - header.push_str(&format!( - "{}\n", - partial_header(RouteContext::new( - stream.get_ref(), - &url, - &route.params, - &stream.ssl().peer_certificate() - )), - )); + header + .push_str(&format!("{}\n", partial_header(route_context.clone()),)); } for (i, partial_footer) in { @@ -394,12 +395,7 @@ impl Router { } { footer.push_str(&format!( "{}{}", - partial_footer(RouteContext::new( - stream.get_ref(), - &url, - &route.params, - &stream.ssl().peer_certificate() - )), + partial_footer(route_context.clone()), if footers_length > 1 && i != footers_length - 1 { "\n" } else { @@ -409,48 +405,45 @@ impl Router { } let mut lock = (*route.value).lock().await; - let handler = lock.call(RouteContext::new( - stream.get_ref(), - &url, - &route.params, - &peer_certificate, - )); + let handler = lock.call(route_context); handler.await } else { (*self.error_handler).lock().unwrap()(ErrorContext::new( - stream.get_ref(), - &url, - &peer_certificate, + url.clone(), + peer_certificate.clone(), )) }; for module in &mut *self.async_modules.lock().await { module .on_post_route(HookContext::new( - stream.get_ref(), - &url, - route.as_ref().map_or(None, |route| Some(&route.params)), - &stream.ssl().peer_certificate(), + url.clone(), + route + .as_ref() + .map_or(None, |route| Some(route.params.clone())), + stream.ssl().peer_certificate().clone(), )) .await; } for module in &mut *self.modules.lock().unwrap() { module.on_post_route(HookContext::new( - stream.get_ref(), - &url, - route.as_ref().map_or(None, |route| Some(&route.params)), - &stream.ssl().peer_certificate(), + url.clone(), + route + .as_ref() + .map_or(None, |route| Some(route.params.clone())), + stream.ssl().peer_certificate().clone(), )); } (*self.post_route_callback).lock().unwrap()( HookContext::new( - stream.get_ref(), - &url, - route.as_ref().map_or(None, |route| Some(&route.params)), - &stream.ssl().peer_certificate(), + url.clone(), + route + .as_ref() + .map_or(None, |route| Some(route.params.clone())), + stream.ssl().peer_certificate(), ), &mut content, ); -- cgit v1.2.3