Implement FromRequest for BytesMut (#2583)

Co-authored-by: Yann Simon <yann.simon@commercetools.com>
This commit is contained in:
Jonas Platte 2024-09-20 20:36:00 +02:00 committed by GitHub
parent 69fac0a065
commit 352b7cf044
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,7 +1,7 @@
use super::{rejection::*, FromRequest, FromRequestParts, Request}; use super::{rejection::*, FromRequest, FromRequestParts, Request};
use crate::{body::Body, RequestExt}; use crate::{body::Body, RequestExt};
use async_trait::async_trait; use async_trait::async_trait;
use bytes::Bytes; use bytes::{BufMut, Bytes, BytesMut};
use http::{request::Parts, Extensions, HeaderMap, Method, Uri, Version}; use http::{request::Parts, Extensions, HeaderMap, Method, Uri, Version};
use http_body_util::BodyExt; use http_body_util::BodyExt;
use std::convert::Infallible; use std::convert::Infallible;
@ -71,6 +71,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] #[async_trait]
impl<S> FromRequest<S> for Bytes impl<S> FromRequest<S> for Bytes
where where