From ff9764574c2e03ef72c0649445046769aee7b60c Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Thu, 23 Nov 2023 12:30:23 +0100 Subject: [PATCH] Implement `FromRequestParts` for `Parts` and `Extensions` (#2328) --- axum-core/src/extract/request_parts.rs | 20 +++++++++++++++---- .../fail/argument_not_extractor.stderr | 4 ++-- .../fail/parts_extracting_body.stderr | 2 +- axum/CHANGELOG.md | 3 +++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/axum-core/src/extract/request_parts.rs b/axum-core/src/extract/request_parts.rs index 1950861513..c9a48e859f 100644 --- a/axum-core/src/extract/request_parts.rs +++ b/axum-core/src/extract/request_parts.rs @@ -2,7 +2,7 @@ use super::{rejection::*, FromRequest, FromRequestParts, Request}; use crate::{body::Body, RequestExt}; use async_trait::async_trait; use bytes::Bytes; -use http::{request::Parts, HeaderMap, Method, Uri, Version}; +use http::{request::Parts, Extensions, HeaderMap, Method, Uri, Version}; use http_body_util::BodyExt; use std::convert::Infallible; @@ -115,14 +115,26 @@ where } #[async_trait] -impl FromRequest for Parts +impl FromRequestParts for Parts where S: Send + Sync, { type Rejection = Infallible; - async fn from_request(req: Request, _: &S) -> Result { - Ok(req.into_parts().0) + async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result { + Ok(parts.clone()) + } +} + +#[async_trait] +impl FromRequestParts for Extensions +where + S: Send + Sync, +{ + type Rejection = Infallible; + + async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result { + Ok(parts.extensions.clone()) } } diff --git a/axum-macros/tests/debug_handler/fail/argument_not_extractor.stderr b/axum-macros/tests/debug_handler/fail/argument_not_extractor.stderr index 83b418bfdd..acda57077a 100644 --- a/axum-macros/tests/debug_handler/fail/argument_not_extractor.stderr +++ b/axum-macros/tests/debug_handler/fail/argument_not_extractor.stderr @@ -10,11 +10,11 @@ error[E0277]: the trait bound `bool: FromRequestParts<()>` is not satisfied > as FromRequestParts> > + > > as FromRequestParts> > - as FromRequestParts> - > + > and $N others = note: required for `bool` to implement `FromRequest<(), axum_core::extract::private::ViaParts>` note: required by a bound in `__axum_macros_check_handler_0_from_request_check` diff --git a/axum-macros/tests/from_request/fail/parts_extracting_body.stderr b/axum-macros/tests/from_request/fail/parts_extracting_body.stderr index 4313d57cd9..f473aefd29 100644 --- a/axum-macros/tests/from_request/fail/parts_extracting_body.stderr +++ b/axum-macros/tests/from_request/fail/parts_extracting_body.stderr @@ -11,8 +11,8 @@ error[E0277]: the trait bound `String: FromRequestParts` is not satisfied > as FromRequestParts> > + > > as FromRequestParts> > - as FromRequestParts> and $N others diff --git a/axum/CHANGELOG.md b/axum/CHANGELOG.md index b561dd8ac8..9195b0ff76 100644 --- a/axum/CHANGELOG.md +++ b/axum/CHANGELOG.md @@ -69,6 +69,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **breaking:** `impl IntoResponse(Parts) for Extension` now requires `T: Clone`, as that is required by the http crate ([#1882]) - **added:** Add `axum::Json::from_bytes` ([#2244]) +- **added:** Implement `FromRequestParts` for `http::request::Parts` ([#2328]) +- **added:** Implement `FromRequestParts` for `http::Extensions` ([#2328]) [#1664]: https://github.com/tokio-rs/axum/pull/1664 [#1751]: https://github.com/tokio-rs/axum/pull/1751 @@ -91,6 +93,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#2143]: https://github.com/tokio-rs/axum/pull/2143 [#2149]: https://github.com/tokio-rs/axum/pull/2149 [#2244]: https://github.com/tokio-rs/axum/pull/2244 +[#2328]: https://github.com/tokio-rs/axum/pull/2328 # 0.6.17 (25. April, 2023)