Skip to content

Commit 4441372

Browse files
committed
feat(body): require Sync when wrapping a dynamic Stream
1 parent 3524db9 commit 4441372

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/body/body.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ enum Kind {
4141
content_length: Option<u64>,
4242
recv: h2::RecvStream,
4343
},
44-
Wrapped(Pin<Box<dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send>>),
44+
// NOTE: This requires `Sync` because of how easy it is to use `await`
45+
// while a borrow of a `Request<Body>` exists.
46+
//
47+
// See https://github.com/rust-lang/rust/issues/57017
48+
Wrapped(Pin<Box<dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send + Sync>>),
4549
}
4650

4751
struct Extra {
@@ -142,7 +146,7 @@ impl Body {
142146
/// ```
143147
pub fn wrap_stream<S>(stream: S) -> Body
144148
where
145-
S: TryStream + Send + 'static,
149+
S: TryStream + Send + Sync + 'static,
146150
S::Error: Into<Box<dyn StdError + Send + Sync>>,
147151
Chunk: From<S::Ok>,
148152
{
@@ -411,13 +415,13 @@ impl Stream for Body {
411415

412416

413417
impl
414-
From<Box<dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send>>
418+
From<Box<dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send + Sync>>
415419
for Body
416420
{
417421
#[inline]
418422
fn from(
419423
stream: Box<
420-
dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send,
424+
dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send + Sync,
421425
>,
422426
) -> Body {
423427
Body::new(Kind::Wrapped(stream.into()))

0 commit comments

Comments
 (0)