Skip to content

Commit ce6f850

Browse files
authored
Merge pull request #114 from silicon-heaven/fix-timeout-when-invalid-rpcmessage
Propagate RpcResponse parser errors through client API
2 parents 46c61bd + 135fce1 commit ce6f850

2 files changed

Lines changed: 36 additions & 24 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "shvclient"
33
description = "A Rust framework for Silicon Heaven RPC devices"
44
license = "MIT"
55
repository = "https://github.com/silicon-heaven/libshvclient-rs"
6-
version = "5.1.1"
6+
version = "5.1.2"
77
edition = "2024"
88

99
[lib]

src/client.rs

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)