1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use std::{
pin::Pin,
task::{Context, Poll},
};
use futures_util::Future;
use http_body::Body;
use pin_project_lite::pin_project;
pin_project! {
pub struct Collect<T>
where
T: Body,
T: ?Sized,
{
pub(crate) collected: Option<crate::Collected<T::Data>>,
#[pin]
pub(crate) body: T,
}
}
impl<T: Body + ?Sized> Future for Collect<T> {
type Output = Result<crate::Collected<T::Data>, T::Error>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> std::task::Poll<Self::Output> {
let mut me = self.project();
loop {
let frame = futures_util::ready!(me.body.as_mut().poll_frame(cx));
let frame = if let Some(frame) = frame {
frame?
} else {
return Poll::Ready(Ok(me.collected.take().expect("polled after complete")));
};
me.collected.as_mut().unwrap().push_frame(frame);
}
}
}