1
0
Fork 0
mirror of https://github.com/actix/actix-web.git synced 2024-05-14 14:33:04 +00:00
actix-web/actix-multipart/src/form/bytes.rs
2023-07-17 02:38:12 +01:00

50 lines
1.3 KiB
Rust

//! Reads a field into memory.
use actix_web::HttpRequest;
use bytes::BytesMut;
use futures_core::future::LocalBoxFuture;
use futures_util::TryStreamExt as _;
use mime::Mime;
use crate::{
form::{FieldReader, Limits},
Field, MultipartError,
};
/// Read the field into memory.
#[derive(Debug)]
pub struct Bytes {
/// The data.
pub data: bytes::Bytes,
/// The value of the `Content-Type` header.
pub content_type: Option<Mime>,
/// The `filename` value in the `Content-Disposition` header.
pub file_name: Option<String>,
}
impl<'t> FieldReader<'t> for Bytes {
type Future = LocalBoxFuture<'t, Result<Self, MultipartError>>;
fn read_field(_: &'t HttpRequest, mut field: Field, limits: &'t mut Limits) -> Self::Future {
Box::pin(async move {
let mut buf = BytesMut::with_capacity(131_072);
while let Some(chunk) = field.try_next().await? {
limits.try_consume_limits(chunk.len(), true)?;
buf.extend(chunk);
}
Ok(Bytes {
data: buf.freeze(),
content_type: field.content_type().map(ToOwned::to_owned),
file_name: field
.content_disposition()
.get_filename()
.map(str::to_owned),
})
})
}
}