1
0
Fork 0
mirror of https://github.com/actix/actix-web.git synced 2024-06-02 21:39:26 +00:00
actix-web/actix-http/src/payload.rs

68 lines
1.6 KiB
Rust
Raw Normal View History

use std::pin::Pin;
use std::task::{Context, Poll};
2019-02-07 21:39:15 +00:00
use bytes::Bytes;
2019-12-13 05:24:57 +00:00
use futures_core::Stream;
2019-02-07 21:39:15 +00:00
use h2::RecvStream;
use crate::error::PayloadError;
2021-12-13 02:58:19 +00:00
/// A boxed payload.
pub type PayloadStream = Pin<Box<dyn Stream<Item = Result<Bytes, PayloadError>>>>;
2019-02-12 19:07:42 +00:00
2021-12-13 02:58:19 +00:00
/// A streaming payload.
2019-02-12 19:07:42 +00:00
pub enum Payload<S = PayloadStream> {
None,
2019-02-07 21:39:15 +00:00
H1(crate::h1::Payload),
H2(crate::h2::Payload),
2019-02-12 19:07:42 +00:00
Stream(S),
2019-02-07 21:39:15 +00:00
}
2019-02-13 21:52:11 +00:00
impl<S> From<crate::h1::Payload> for Payload<S> {
fn from(v: crate::h1::Payload) -> Self {
Payload::H1(v)
2019-02-07 21:39:15 +00:00
}
}
2019-02-13 21:52:11 +00:00
impl<S> From<crate::h2::Payload> for Payload<S> {
fn from(v: crate::h2::Payload) -> Self {
Payload::H2(v)
2019-02-12 19:07:42 +00:00
}
}
2019-02-13 21:52:11 +00:00
impl<S> From<RecvStream> for Payload<S> {
fn from(v: RecvStream) -> Self {
Payload::H2(crate::h2::Payload::new(v))
2019-02-12 19:07:42 +00:00
}
}
impl From<PayloadStream> for Payload {
fn from(pl: PayloadStream) -> Self {
Payload::Stream(pl)
}
}
2019-03-03 02:37:09 +00:00
impl<S> Payload<S> {
/// Takes current payload and replaces it with `None` value
pub fn take(&mut self) -> Payload<S> {
2019-03-03 02:37:09 +00:00
std::mem::replace(self, Payload::None)
}
}
2019-02-12 19:07:42 +00:00
impl<S> Stream for Payload<S>
where
S: Stream<Item = Result<Bytes, PayloadError>> + Unpin,
2019-02-12 19:07:42 +00:00
{
type Item = Result<Bytes, PayloadError>;
2019-02-07 21:39:15 +00:00
#[inline]
2021-12-08 06:01:11 +00:00
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
match self.get_mut() {
Payload::None => Poll::Ready(None),
Payload::H1(ref mut pl) => pl.readany(cx),
Payload::H2(ref mut pl) => Pin::new(pl).poll_next(cx),
Payload::Stream(ref mut pl) => Pin::new(pl).poll_next(cx),
2019-02-07 21:39:15 +00:00
}
}
}