@@ -19,6 +19,7 @@ pub(super) struct RequestHandle {
1919 id : usize ,
2020 shared_state : Arc < SharedRequestStates > ,
2121 manager : LoopManagerShared ,
22+ is_recv_unpause_sent : bool ,
2223}
2324
2425enum LoopTask {
@@ -79,7 +80,7 @@ impl RequestHandle {
7980 . await
8081 }
8182
82- pub ( super ) async fn poll_bytes_async < T > (
83+ pub ( super ) async fn wait_for_bytes < T > (
8384 & mut self ,
8485 cb : impl FnOnce ( & mut Vec < u8 > ) -> nyquest_interface:: Result < T > ,
8586 ) -> nyquest_interface:: Result < Option < T > > {
@@ -100,16 +101,20 @@ impl RequestHandle {
100101 cb : impl FnOnce ( & mut Vec < u8 > ) -> nyquest_interface:: Result < T > ,
101102 ) -> Poll < nyquest_interface:: Result < Option < T > > > {
102103 let mut state = self . shared_state . state . lock ( ) . unwrap ( ) ;
103- if ! state. state . response_buffer . is_empty ( ) {
104+ if state. state . data_available ( ) {
104105 let res = cb ( & mut state. state . response_buffer ) ;
106+ self . is_recv_unpause_sent = false ;
105107 return Poll :: Ready ( res. map ( Some ) ) ;
106108 }
107109 if let RequestResult :: Done { res, .. } = std:: mem:: take ( & mut state. result ) {
110+ self . is_recv_unpause_sent = false ;
108111 return Poll :: Ready ( res. map ( |_| None ) ) ;
109112 } ;
110- self . manager
111- . dispatch_task ( LoopTask :: UnpauseRecvHandle ( self . id ) )
112- . ok ( ) ;
113+ if !std:: mem:: replace ( & mut self . is_recv_unpause_sent , true ) {
114+ self . manager
115+ . dispatch_task ( LoopTask :: UnpauseRecvHandle ( self . id ) )
116+ . ok ( ) ;
117+ }
113118 self . shared_state . waker . register ( cx. waker ( ) ) ;
114119 Poll :: Pending
115120 }
@@ -244,6 +249,7 @@ impl LoopManager {
244249 id : res,
245250 shared_state,
246251 manager : inner,
252+ is_recv_unpause_sent : false ,
247253 } )
248254 }
249255 Err ( res) => res,
@@ -333,7 +339,6 @@ fn run_loop(multl_waker_tx: oneshot::Sender<LoopManagerShared>) {
333339 {
334340 return ;
335341 }
336- // TODO: store ctx in Easy2Handle
337342 let mut tasks = Default :: default ( ) ;
338343 let mut last_call = false ;
339344 loop {
@@ -408,20 +413,32 @@ fn run_loop(multl_waker_tx: oneshot::Sender<LoopManagerShared>) {
408413 } ;
409414 }
410415 LoopTask :: UnpauseRecvHandle ( id) => {
411- if let Some ( easy) = multi. lookup ( id) {
412- // Ignore the error. Also see
413- // https://github.com/sagebind/isahc/blob/9d1edd475231ad5cfd5842d939db1382dc3a88f5/src/agent/mod.rs#L432
414- easy. as_raw_easy_mut ( ) . unpause_recv ( ) . ok ( ) ;
416+ let Some ( mut handle) = multi. lookup ( id) else {
417+ continue ;
418+ } ;
419+ let ctx = handle. as_callback_mut ( ) . ctx . clone ( ) ;
420+ if let Err ( e) =
421+ handle. with_error_message ( |e| e. as_raw_easy_mut ( ) . unpause_recv ( ) )
422+ {
423+ let res = Err ( e. into ( ) ) ;
424+ ctx. state . lock ( ) . unwrap ( ) . result = RequestResult :: Done { res, id } ;
425+ ctx. waker . wake ( ) ;
415426 }
416427 }
417428 LoopTask :: UnpauseSendHandle ( id) => {
418- if let Some ( mut easy) = multi. lookup ( id) {
429+ let Some ( mut handle) = multi. lookup ( id) else {
430+ continue ;
431+ } ;
432+ let ctx = handle. as_callback_mut ( ) . ctx . clone ( ) ;
433+ if let Err ( e) = handle. with_error_message ( |mut e| {
419434 // curl seems buggy with unsized upload multipart streams (i.e. chunked)
420435 // Pausing and unpausing again seems to make it work
421- easy. as_mut ( ) . as_raw_easy_mut ( ) . pause_send ( ) . ok ( ) ;
422- // Ignore the error. Also see
423- // https://github.com/sagebind/isahc/blob/9d1edd475231ad5cfd5842d939db1382dc3a88f5/src/agent/mod.rs#L432
424- easy. as_raw_easy_mut ( ) . unpause_send ( ) . ok ( ) ;
436+ e. as_mut ( ) . as_raw_easy_mut ( ) . pause_send ( ) ?;
437+ e. as_raw_easy_mut ( ) . unpause_send ( )
438+ } ) {
439+ let res = Err ( e. into ( ) ) ;
440+ ctx. state . lock ( ) . unwrap ( ) . result = RequestResult :: Done { res, id } ;
441+ ctx. waker . wake ( ) ;
425442 }
426443 }
427444 LoopTask :: DropHandle ( id) => {
0 commit comments