@@ -35,6 +35,7 @@ pub struct Body {
3535enum Kind {
3636 Once ( Option < Chunk > ) ,
3737 Chan {
38+ content_length : Option < u64 > ,
3839 abort_rx : oneshot:: Receiver < ( ) > ,
3940 rx : mpsc:: Receiver < Result < Chunk , :: Error > > ,
4041 } ,
@@ -85,6 +86,11 @@ impl Body {
8586 /// Useful when wanting to stream chunks from another thread.
8687 #[ inline]
8788 pub fn channel ( ) -> ( Sender , Body ) {
89+ Self :: new_channel ( None )
90+ }
91+
92+ #[ inline]
93+ pub ( crate ) fn new_channel ( content_length : Option < u64 > ) -> ( Sender , Body ) {
8894 let ( tx, rx) = mpsc:: channel ( 0 ) ;
8995 let ( abort_tx, abort_rx) = oneshot:: channel ( ) ;
9096
@@ -93,8 +99,9 @@ impl Body {
9399 tx : tx,
94100 } ;
95101 let rx = Body :: new ( Kind :: Chan {
96- abort_rx : abort_rx,
97- rx : rx,
102+ content_length,
103+ abort_rx,
104+ rx,
98105 } ) ;
99106
100107 ( tx, rx)
@@ -188,13 +195,19 @@ impl Body {
188195 fn poll_inner ( & mut self ) -> Poll < Option < Chunk > , :: Error > {
189196 match self . kind {
190197 Kind :: Once ( ref mut val) => Ok ( Async :: Ready ( val. take ( ) ) ) ,
191- Kind :: Chan { ref mut rx, ref mut abort_rx } => {
198+ Kind :: Chan { content_length : ref mut len , ref mut rx, ref mut abort_rx } => {
192199 if let Ok ( Async :: Ready ( ( ) ) ) = abort_rx. poll ( ) {
193200 return Err ( :: Error :: new_body_write ( "body write aborted" ) ) ;
194201 }
195202
196203 match rx. poll ( ) . expect ( "mpsc cannot error" ) {
197- Async :: Ready ( Some ( Ok ( chunk) ) ) => Ok ( Async :: Ready ( Some ( chunk) ) ) ,
204+ Async :: Ready ( Some ( Ok ( chunk) ) ) => {
205+ if let Some ( ref mut len) = * len {
206+ debug_assert ! ( * len >= chunk. len( ) as u64 ) ;
207+ * len = * len - chunk. len ( ) as u64 ;
208+ }
209+ Ok ( Async :: Ready ( Some ( chunk) ) )
210+ }
198211 Async :: Ready ( Some ( Err ( err) ) ) => Err ( err) ,
199212 Async :: Ready ( None ) => Ok ( Async :: Ready ( None ) ) ,
200213 Async :: NotReady => Ok ( Async :: NotReady ) ,
@@ -243,7 +256,7 @@ impl Payload for Body {
243256 fn is_end_stream ( & self ) -> bool {
244257 match self . kind {
245258 Kind :: Once ( ref val) => val. is_none ( ) ,
246- Kind :: Chan { .. } => false ,
259+ Kind :: Chan { content_length : len , .. } => len == Some ( 0 ) ,
247260 Kind :: H2 ( ref h2) => h2. is_end_stream ( ) ,
248261 Kind :: Wrapped ( ..) => false ,
249262 }
@@ -253,7 +266,7 @@ impl Payload for Body {
253266 match self . kind {
254267 Kind :: Once ( Some ( ref val) ) => Some ( val. len ( ) as u64 ) ,
255268 Kind :: Once ( None ) => Some ( 0 ) ,
256- Kind :: Chan { .. } => None ,
269+ Kind :: Chan { content_length : len , .. } => len ,
257270 Kind :: H2 ( ..) => None ,
258271 Kind :: Wrapped ( ..) => None ,
259272 }
0 commit comments