Make Middleware always Send + Sync + 'static

This commit is contained in:
Martin Algesten
2021-12-21 08:44:53 +01:00
parent 81c0e66ec7
commit 3b68dce23a
3 changed files with 7 additions and 11 deletions

View File

@@ -43,7 +43,7 @@ pub struct AgentBuilder {
#[cfg(feature = "cookies")] #[cfg(feature = "cookies")]
cookie_store: Option<CookieStore>, cookie_store: Option<CookieStore>,
resolver: ArcResolver, resolver: ArcResolver,
middleware: Vec<Box<dyn Middleware + Send + Sync>>, middleware: Vec<Box<dyn Middleware>>,
} }
/// Config as built by AgentBuilder and then static for the lifetime of the Agent. /// Config as built by AgentBuilder and then static for the lifetime of the Agent.
@@ -111,7 +111,7 @@ pub(crate) struct AgentState {
#[cfg(feature = "cookies")] #[cfg(feature = "cookies")]
pub(crate) cookie_tin: CookieTin, pub(crate) cookie_tin: CookieTin,
pub(crate) resolver: ArcResolver, pub(crate) resolver: ArcResolver,
pub(crate) middleware: Vec<Box<dyn Middleware + Send + Sync>>, pub(crate) middleware: Vec<Box<dyn Middleware>>,
} }
impl Agent { impl Agent {
@@ -601,7 +601,7 @@ impl AgentBuilder {
/// ///
/// All requests made by the agent will use this middleware. Middleware is invoked /// All requests made by the agent will use this middleware. Middleware is invoked
/// in the order they are added to the builder. /// in the order they are added to the builder.
pub fn middleware(mut self, m: impl Middleware + Send + Sync + 'static) -> Self { pub fn middleware(mut self, m: impl Middleware) -> Self {
self.middleware.push(Box::new(m)); self.middleware.push(Box::new(m));
self self
} }

View File

@@ -126,7 +126,7 @@ use crate::{Error, Request, Response};
/// ///
/// # Ok(()) } /// # Ok(()) }
/// ``` /// ```
pub trait Middleware { pub trait Middleware: Send + Sync + 'static {
/// Handle of the middleware logic. /// Handle of the middleware logic.
fn handle(&self, request: Request, next: MiddlewareNext) -> Result<Response, Error>; fn handle(&self, request: Request, next: MiddlewareNext) -> Result<Response, Error>;
} }
@@ -158,7 +158,7 @@ impl<'a> MiddlewareNext<'a> {
impl<F> Middleware for F impl<F> Middleware for F
where where
F: Fn(Request, MiddlewareNext) -> Result<Response, Error>, F: Fn(Request, MiddlewareNext) -> Result<Response, Error> + Send + Sync + 'static,
{ {
fn handle(&self, request: Request, next: MiddlewareNext) -> Result<Response, Error> { fn handle(&self, request: Request, next: MiddlewareNext) -> Result<Response, Error> {
(self)(request, next) (self)(request, next)

View File

@@ -7,8 +7,8 @@ use crate::body::Payload;
use crate::header::{self, Header}; use crate::header::{self, Header};
use crate::middleware::MiddlewareNext; use crate::middleware::MiddlewareNext;
use crate::unit::{self, Unit}; use crate::unit::{self, Unit};
use crate::Response;
use crate::{agent::Agent, error::Error}; use crate::{agent::Agent, error::Error};
use crate::{Middleware, Response};
pub type Result<T> = std::result::Result<T, Error>; pub type Result<T> = std::result::Result<T, Error>;
@@ -143,11 +143,7 @@ impl Request {
let response = if !self.agent.state.middleware.is_empty() { let response = if !self.agent.state.middleware.is_empty() {
// Clone agent to get a local copy with same lifetime as Payload // Clone agent to get a local copy with same lifetime as Payload
let agent = self.agent.clone(); let agent = self.agent.clone();
let chain = &mut agent let chain = &mut agent.state.middleware.iter().map(|mw| mw.as_ref());
.state
.middleware
.iter()
.map(|mw| mw.as_ref() as &dyn Middleware);
let request_fn = Box::new(request_fn); let request_fn = Box::new(request_fn);