@@ -11,7 +11,6 @@ use common::Never;
11
11
use super :: { Chunk , Payload } ;
12
12
use super :: internal:: { FullDataArg , FullDataRet } ;
13
13
14
-
15
14
type BodySender = mpsc:: Sender < Result < Chunk , :: Error > > ;
16
15
17
16
/// A stream of `Chunk`s, used when receiving bodies.
@@ -36,7 +35,7 @@ pub struct Body {
36
35
enum Kind {
37
36
Once ( Option < Chunk > ) ,
38
37
Chan {
39
- _close_tx : oneshot:: Sender < ( ) > ,
38
+ abort_rx : oneshot:: Receiver < ( ) > ,
40
39
rx : mpsc:: Receiver < Result < Chunk , :: Error > > ,
41
40
} ,
42
41
H2 ( h2:: RecvStream ) ,
@@ -61,7 +60,7 @@ enum DelayEof {
61
60
#[ must_use = "Sender does nothing unless sent on" ]
62
61
#[ derive( Debug ) ]
63
62
pub struct Sender {
64
- close_rx : oneshot:: Receiver < ( ) > ,
63
+ abort_tx : oneshot:: Sender < ( ) > ,
65
64
tx : BodySender ,
66
65
}
67
66
@@ -87,14 +86,14 @@ impl Body {
87
86
#[ inline]
88
87
pub fn channel ( ) -> ( Sender , Body ) {
89
88
let ( tx, rx) = mpsc:: channel ( 0 ) ;
90
- let ( close_tx , close_rx ) = oneshot:: channel ( ) ;
89
+ let ( abort_tx , abort_rx ) = oneshot:: channel ( ) ;
91
90
92
91
let tx = Sender {
93
- close_rx : close_rx ,
92
+ abort_tx : abort_tx ,
94
93
tx : tx,
95
94
} ;
96
95
let rx = Body :: new ( Kind :: Chan {
97
- _close_tx : close_tx ,
96
+ abort_rx : abort_rx ,
98
97
rx : rx,
99
98
} ) ;
100
99
@@ -189,11 +188,17 @@ impl Body {
189
188
fn poll_inner ( & mut self ) -> Poll < Option < Chunk > , :: Error > {
190
189
match self . kind {
191
190
Kind :: Once ( ref mut val) => Ok ( Async :: Ready ( val. take ( ) ) ) ,
192
- Kind :: Chan { ref mut rx, .. } => match rx. poll ( ) . expect ( "mpsc cannot error" ) {
193
- Async :: Ready ( Some ( Ok ( chunk) ) ) => Ok ( Async :: Ready ( Some ( chunk) ) ) ,
194
- Async :: Ready ( Some ( Err ( err) ) ) => Err ( err) ,
195
- Async :: Ready ( None ) => Ok ( Async :: Ready ( None ) ) ,
196
- Async :: NotReady => Ok ( Async :: NotReady ) ,
191
+ Kind :: Chan { ref mut rx, ref mut abort_rx } => {
192
+ if let Ok ( Async :: Ready ( ( ) ) ) = abort_rx. poll ( ) {
193
+ return Err ( :: Error :: new_body_write ( "body write aborted" ) ) ;
194
+ }
195
+
196
+ match rx. poll ( ) . expect ( "mpsc cannot error" ) {
197
+ Async :: Ready ( Some ( Ok ( chunk) ) ) => Ok ( Async :: Ready ( Some ( chunk) ) ) ,
198
+ Async :: Ready ( Some ( Err ( err) ) ) => Err ( err) ,
199
+ Async :: Ready ( None ) => Ok ( Async :: Ready ( None ) ) ,
200
+ Async :: NotReady => Ok ( Async :: NotReady ) ,
201
+ }
197
202
} ,
198
203
Kind :: H2 ( ref mut h2) => {
199
204
h2. poll ( )
@@ -283,7 +288,7 @@ impl fmt::Debug for Body {
283
288
impl Sender {
284
289
/// Check to see if this `Sender` can send more data.
285
290
pub fn poll_ready ( & mut self ) -> Poll < ( ) , :: Error > {
286
- match self . close_rx . poll ( ) {
291
+ match self . abort_tx . poll_cancel ( ) {
287
292
Ok ( Async :: Ready ( ( ) ) ) | Err ( _) => return Err ( :: Error :: new_closed ( ) ) ,
288
293
Ok ( Async :: NotReady ) => ( ) ,
289
294
}
@@ -303,6 +308,11 @@ impl Sender {
303
308
. map_err ( |err| err. into_inner ( ) . expect ( "just sent Ok" ) )
304
309
}
305
310
311
+ /// Aborts the body in an abnormal fashion.
312
+ pub fn abort ( self ) {
313
+ let _ = self . abort_tx . send ( ( ) ) ;
314
+ }
315
+
306
316
pub ( crate ) fn send_error ( & mut self , err : :: Error ) {
307
317
let _ = self . tx . try_send ( Err ( err) ) ;
308
318
}
0 commit comments