diff --git a/axum-core/src/extract/mod.rs b/axum-core/src/extract/mod.rs index 45002f75..18836442 100644 --- a/axum-core/src/extract/mod.rs +++ b/axum-core/src/extract/mod.rs @@ -101,9 +101,12 @@ where { type Rejection = >::Rejection; - async fn from_request(req: Request, state: &S) -> Result { + fn from_request( + req: Request, + state: &S, + ) -> impl Future> { let (mut parts, _) = req.into_parts(); - Self::from_request_parts(&mut parts, state).await + async move { Self::from_request_parts(&mut parts, state).await } } } diff --git a/axum-core/src/extract/tuple.rs b/axum-core/src/extract/tuple.rs index cbd91a7f..ccfd21d0 100644 --- a/axum-core/src/extract/tuple.rs +++ b/axum-core/src/extract/tuple.rs @@ -1,7 +1,7 @@ use super::{FromRequest, FromRequestParts, Request}; use crate::response::{IntoResponse, Response}; use http::request::Parts; -use std::convert::Infallible; +use std::{convert::Infallible, future::Future}; impl FromRequestParts for () where @@ -52,18 +52,20 @@ macro_rules! impl_from_request { { type Rejection = Response; - async fn from_request(req: Request, state: &S) -> Result { + fn from_request(req: Request, state: &S) -> impl Future> { let (mut parts, body) = req.into_parts(); - $( - let $ty = $ty::from_request_parts(&mut parts, state).await.map_err(|err| err.into_response())?; - )* + async move { + $( + let $ty = $ty::from_request_parts(&mut parts, state).await.map_err(|err| err.into_response())?; + )* - let req = Request::from_parts(parts, body); + let req = Request::from_parts(parts, body); - let $last = $last::from_request(req, state).await.map_err(|err| err.into_response())?; + let $last = $last::from_request(req, state).await.map_err(|err| err.into_response())?; - Ok(($($ty,)* $last,)) + Ok(($($ty,)* $last,)) + } } } }; diff --git a/axum-extra/src/handler/or.rs b/axum-extra/src/handler/or.rs index 18f119e6..76b5b7a9 100644 --- a/axum-extra/src/handler/or.rs +++ b/axum-extra/src/handler/or.rs @@ -66,9 +66,9 @@ where type Future = BoxFuture<'static, Response>; fn call(self, req: Request, state: S) -> Self::Future { - Box::pin(async move { - let (mut parts, body) = req.into_parts(); + let (mut parts, body) = req.into_parts(); + Box::pin(async move { if let Ok(lt) = Lt::from_request_parts(&mut parts, &state).await { return self.lhs.call(lt, state).await; } diff --git a/axum/src/error_handling/mod.rs b/axum/src/error_handling/mod.rs index 1b120350..90da3e97 100644 --- a/axum/src/error_handling/mod.rs +++ b/axum/src/error_handling/mod.rs @@ -180,9 +180,9 @@ macro_rules! impl_service { let clone = self.inner.clone(); let inner = std::mem::replace(&mut self.inner, clone); - let future = Box::pin(async move { - let (mut parts, body) = req.into_parts(); + let (mut parts, body) = req.into_parts(); + let future = Box::pin(async move { $( let $ty = match $ty::from_request_parts(&mut parts, &()).await { Ok(value) => value, diff --git a/axum/src/middleware/from_extractor.rs b/axum/src/middleware/from_extractor.rs index 0c916c1d..c821a953 100644 --- a/axum/src/middleware/from_extractor.rs +++ b/axum/src/middleware/from_extractor.rs @@ -214,8 +214,9 @@ where fn call(&mut self, req: Request) -> Self::Future { let state = self.state.clone(); + let (mut parts, body) = req.into_parts(); + let extract_future = Box::pin(async move { - let (mut parts, body) = req.into_parts(); let extracted = E::from_request_parts(&mut parts, &state).await; let req = Request::from_parts(parts, body); (req, extracted) diff --git a/axum/src/middleware/from_fn.rs b/axum/src/middleware/from_fn.rs index c8a8e1f7..daa76ec6 100644 --- a/axum/src/middleware/from_fn.rs +++ b/axum/src/middleware/from_fn.rs @@ -283,10 +283,9 @@ macro_rules! impl_service { let mut f = self.f.clone(); let state = self.state.clone(); + let (mut parts, body) = req.into_parts(); let future = Box::pin(async move { - let (mut parts, body) = req.into_parts(); - $( let $ty = match $ty::from_request_parts(&mut parts, &state).await { Ok(value) => value, diff --git a/axum/src/middleware/map_request.rs b/axum/src/middleware/map_request.rs index 596b6c3c..488a19b1 100644 --- a/axum/src/middleware/map_request.rs +++ b/axum/src/middleware/map_request.rs @@ -282,10 +282,9 @@ macro_rules! impl_service { let mut f = self.f.clone(); let state = self.state.clone(); + let (mut parts, body) = req.into_parts(); let future = Box::pin(async move { - let (mut parts, body) = req.into_parts(); - $( let $ty = match $ty::from_request_parts(&mut parts, &state).await { Ok(value) => value, diff --git a/axum/src/middleware/map_response.rs b/axum/src/middleware/map_response.rs index 2510cdc2..3a1f6de5 100644 --- a/axum/src/middleware/map_response.rs +++ b/axum/src/middleware/map_response.rs @@ -261,10 +261,9 @@ macro_rules! impl_service { let mut f = self.f.clone(); let _state = self.state.clone(); + let (mut parts, body) = req.into_parts(); let future = Box::pin(async move { - let (mut parts, body) = req.into_parts(); - $( let $ty = match $ty::from_request_parts(&mut parts, &_state).await { Ok(value) => value,