@@ -601,30 +601,42 @@ impl<V: ClientVariant> Client<V> {
601601 warn ! ( "Invalid shv request" ) ;
602602 }
603603 } else if frame. is_response ( ) {
604- if let ( Some ( req_id) , Ok ( rpcmsg) ) = ( frame. request_id ( ) , frame. to_rpcmesage ( ) ) {
605- let frame_sender = if rpcmsg. is_delay ( ) {
606- // Update the RPC call timer
607- pending_rpc_calls
608- . get ( & req_id)
609- . map ( |( frame_sender, timer_updater) | {
610- timer_updater. unbounded_send ( ( ) ) . unwrap_or_default ( ) ;
611- frame_sender. clone ( )
612- } )
613- } else {
614- pending_rpc_calls
615- . remove ( & req_id)
616- . map ( |( frame_sender, _) | frame_sender)
617- } ;
618-
619- if let Some ( frame_sender) = frame_sender {
620- frame_sender
621- . unbounded_send ( frame)
622- . unwrap_or_default ( ) ;
623- } else if let Some ( subscr_id) = subscription_requests. remove ( & req_id)
624- && let Some ( subscr) = subscriptions. 0 . iter_mut ( ) . find ( |s| s. subscr_id == subscr_id) {
625- send_subscription_frame ( subscr, frame) ;
626- subscr. confirmed = true ;
604+ if let Some ( req_id) = frame. request_id ( ) {
605+ match frame. to_rpcmesage ( ) {
606+ Ok ( rpcmsg) => {
607+ let frame_sender = if rpcmsg. is_delay ( ) {
608+ // Update the RPC call timer
609+ pending_rpc_calls
610+ . get ( & req_id)
611+ . map ( |( frame_sender, timer_updater) | {
612+ timer_updater. unbounded_send ( ( ) ) . unwrap_or_default ( ) ;
613+ frame_sender. clone ( )
614+ } )
615+ } else {
616+ pending_rpc_calls
617+ . remove ( & req_id)
618+ . map ( |( frame_sender, _) | frame_sender)
619+ } ;
620+
621+ if let Some ( frame_sender) = frame_sender {
622+ frame_sender
623+ . unbounded_send ( frame)
624+ . unwrap_or_default ( ) ;
625+ } else if let Some ( subscr_id) = subscription_requests. remove ( & req_id)
626+ && let Some ( subscr) = subscriptions. 0 . iter_mut ( ) . find ( |s| s. subscr_id == subscr_id) {
627+ send_subscription_frame ( subscr, frame) ;
628+ subscr. confirmed = true ;
629+ }
630+ }
631+ Err ( err) => {
632+ let mut resp = RpcMessage :: from_meta ( frame. meta ) ;
633+ resp. set_error ( RpcError :: new (
634+ RpcErrorCode :: ParseError ,
635+ format ! ( "Received invalid response to request with id {req_id}: {err}" ) ,
636+ ) ) ;
637+ client_cmd_tx. send_message ( resp) ?;
627638 }
639+ }
628640 }
629641 } else if frame. is_signal ( )
630642 && let ( Some ( path) , source, signal) = ( frame. shv_path ( ) , frame. source ( ) , frame. method ( ) )
0 commit comments