aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-05-02 14:56:26 -0400
committerJesse Luehrs <doy@tozt.net>2020-05-02 14:56:26 -0400
commit9bfd14efd09cfafa0cf7d7896e663ed392c96ff7 (patch)
tree6e544b3605f1106387053d27dd09ecac79f2e96e
parentdb068a8eb136b53766bb682aa7fb73b8db53674b (diff)
downloadrbw-9bfd14efd09cfafa0cf7d7896e663ed392c96ff7.tar.gz
rbw-9bfd14efd09cfafa0cf7d7896e663ed392c96ff7.zip
don't kill the agent if it fails to parse a message
-rw-r--r--src/bin/rbw-agent/agent.rs9
-rw-r--r--src/bin/rbw-agent/sock.rs9
2 files changed, 16 insertions, 2 deletions
diff --git a/src/bin/rbw-agent/agent.rs b/src/bin/rbw-agent/agent.rs
index e80e1c6..9021569 100644
--- a/src/bin/rbw-agent/agent.rs
+++ b/src/bin/rbw-agent/agent.rs
@@ -118,6 +118,15 @@ async fn handle_request(
.recv()
.await
.context("failed to receive incoming message")?;
+ let req = match req {
+ Ok(msg) => msg,
+ Err(error) => {
+ sock.send(&rbw::protocol::Response::Error { error })
+ .await
+ .context("failed to send response")?;
+ return Ok(());
+ }
+ };
let set_timeout = match &req.action {
rbw::protocol::Action::Login => {
crate::actions::login(sock, state.clone(), req.tty.as_deref())
diff --git a/src/bin/rbw-agent/sock.rs b/src/bin/rbw-agent/sock.rs
index 688f87a..bb2d6fb 100644
--- a/src/bin/rbw-agent/sock.rs
+++ b/src/bin/rbw-agent/sock.rs
@@ -26,14 +26,19 @@ impl Sock {
Ok(())
}
- pub async fn recv(&mut self) -> anyhow::Result<rbw::protocol::Request> {
+ pub async fn recv(
+ &mut self,
+ ) -> anyhow::Result<std::result::Result<rbw::protocol::Request, String>>
+ {
let Self(sock) = self;
let mut buf = tokio::io::BufStream::new(sock);
let mut line = String::new();
buf.read_line(&mut line)
.await
.context("failed to read message from socket")?;
- Ok(serde_json::from_str(&line).context("failed to parse message")?)
+ Ok(serde_json::from_str(&line).map_err(|e| {
+ format!("failed to parse message '{}': {}", line, e)
+ }))
}
}