diff options
author | Jonas Platte <jplatte+git@posteo.de> | 2024-09-20 20:36:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-20 20:36:00 +0200 |
commit | 352b7cf044154a9db9337d7fc985615faf3c3d07 (patch) | |
tree | 5ad538c61f3142ad407d90bf74f8d90ca44d8434 | |
parent | 69fac0a06550abf144f377f57db015e3db51008d (diff) |
Implement FromRequest for BytesMut (#2583)
Co-authored-by: Yann Simon <yann.simon@commercetools.com>
-rw-r--r-- | axum-core/src/extract/request_parts.rs | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/axum-core/src/extract/request_parts.rs b/axum-core/src/extract/request_parts.rs index 73f54db7..789b9c1c 100644 --- a/axum-core/src/extract/request_parts.rs +++ b/axum-core/src/extract/request_parts.rs @@ -1,7 +1,7 @@ use super::{rejection::*, FromRequest, FromRequestParts, Request}; use crate::{body::Body, RequestExt}; use async_trait::async_trait; -use bytes::Bytes; +use bytes::{BufMut, Bytes, BytesMut}; use http::{request::Parts, Extensions, HeaderMap, Method, Uri, Version}; use http_body_util::BodyExt; use std::convert::Infallible; @@ -72,6 +72,37 @@ where } #[async_trait] +impl<S> FromRequest<S> for BytesMut +where + S: Send + Sync, +{ + type Rejection = BytesRejection; + + async fn from_request(req: Request, _: &S) -> Result<Self, Self::Rejection> { + let mut body = req.into_limited_body(); + let mut bytes = BytesMut::new(); + body_to_bytes_mut(&mut body, &mut bytes).await?; + Ok(bytes) + } +} + +async fn body_to_bytes_mut(body: &mut Body, bytes: &mut BytesMut) -> Result<(), BytesRejection> { + while let Some(frame) = body + .frame() + .await + .transpose() + .map_err(FailedToBufferBody::from_err)? + { + let Ok(data) = frame.into_data() else { + return Ok(()); + }; + bytes.put(data); + } + + Ok(()) +} + +#[async_trait] impl<S> FromRequest<S> for Bytes where S: Send + Sync, |