1
0
mirror of https://github.com/fafhrd91/actix-web synced 2025-06-25 22:49:21 +02:00

simplify Payload extractor

This commit is contained in:
Nikolay Kim
2019-03-24 17:00:59 -07:00
parent ed322c175e
commit e37e81af0b
6 changed files with 51 additions and 71 deletions

View File

@ -23,9 +23,7 @@ use crate::service::ServiceFromRequest;
/// use actix_web::{web, error, App, Error, HttpResponse};
///
/// /// extract binary data from request
/// fn index<P>(body: web::Payload<P>) -> impl Future<Item = HttpResponse, Error = Error>
/// where
/// P: Stream<Item = web::Bytes, Error = error::PayloadError>
/// fn index(body: web::Payload) -> impl Future<Item = HttpResponse, Error = Error>
/// {
/// body.map_err(Error::from)
/// .fold(web::BytesMut::new(), move |mut body, chunk| {
@ -45,12 +43,9 @@ use crate::service::ServiceFromRequest;
/// );
/// }
/// ```
pub struct Payload<T>(crate::dev::Payload<T>);
pub struct Payload(crate::dev::Payload<Box<Stream<Item = Bytes, Error = PayloadError>>>);
impl<T> Stream for Payload<T>
where
T: Stream<Item = Bytes, Error = PayloadError>,
{
impl Stream for Payload {
type Item = Bytes;
type Error = PayloadError;
@ -69,9 +64,7 @@ where
/// use actix_web::{web, error, App, Error, HttpResponse};
///
/// /// extract binary data from request
/// fn index<P>(body: web::Payload<P>) -> impl Future<Item = HttpResponse, Error = Error>
/// where
/// P: Stream<Item = web::Bytes, Error = error::PayloadError>
/// fn index(body: web::Payload) -> impl Future<Item = HttpResponse, Error = Error>
/// {
/// body.map_err(Error::from)
/// .fold(web::BytesMut::new(), move |mut body, chunk| {
@ -91,16 +84,26 @@ where
/// );
/// }
/// ```
impl<P> FromRequest<P> for Payload<P>
impl<P> FromRequest<P> for Payload
where
P: Stream<Item = Bytes, Error = PayloadError>,
P: Stream<Item = Bytes, Error = PayloadError> + 'static,
{
type Error = Error;
type Future = Result<Payload<P>, Error>;
type Future = Result<Payload, Error>;
#[inline]
fn from_request(req: &mut ServiceFromRequest<P>) -> Self::Future {
Ok(Payload(req.take_payload()))
let pl = match req.take_payload() {
crate::dev::Payload::Stream(s) => {
let pl: Box<dyn Stream<Item = Bytes, Error = PayloadError>> =
Box::new(s);
crate::dev::Payload::Stream(pl)
}
crate::dev::Payload::None => crate::dev::Payload::None,
crate::dev::Payload::H1(pl) => crate::dev::Payload::H1(pl),
crate::dev::Payload::H2(pl) => crate::dev::Payload::H2(pl),
};
Ok(Payload(pl))
}
}