diff --git a/actix-http/src/body.rs b/actix-http/src/body.rs index 816a31adf..94ce5fb8e 100644 --- a/actix-http/src/body.rs +++ b/actix-http/src/body.rs @@ -379,7 +379,7 @@ where { pub fn new(stream: S) -> Self { BodyStream { - stream, + stream: Box::pin(stream), _t: PhantomData, } } @@ -416,8 +416,7 @@ where #[pin_project] pub struct SizedStream { size: u64, - #[pin] - stream: S, + stream: Pin>, } impl SizedStream @@ -425,7 +424,7 @@ where S: Stream> + Unpin, { pub fn new(size: u64, stream: S) -> Self { - SizedStream { size, stream } + SizedStream { size, stream: Box::pin(stream) } } } diff --git a/tests/test_weird_poll.rs b/tests/test_weird_poll.rs new file mode 100644 index 000000000..21d1d611a --- /dev/null +++ b/tests/test_weird_poll.rs @@ -0,0 +1,26 @@ +// Regression test for #/1321 + +use futures::task::{noop_waker, Context}; +use futures::stream::once; +use actix_http::body::{MessageBody, BodyStream}; +use bytes::Bytes; + +#[test] +fn weird_poll() { + let (sender, receiver) = futures::channel::oneshot::channel(); + let mut body_stream = Ok(BodyStream::new(once(async { + let x = Box::new(0); + let y = &x; + receiver.await.unwrap(); + let _z = **y; + Ok::<_, ()>(Bytes::new()) + }))); + + let waker = noop_waker(); + let mut context = Context::from_waker(&waker); + + let _ = body_stream.as_mut().unwrap().poll_next(&mut context); + sender.send(()).unwrap(); + let _ = std::mem::replace(&mut body_stream, Err([0; 32])).unwrap().poll_next(&mut context); +} +