diff options
author | Jesse Luehrs <doy@tozt.net> | 2020-05-02 14:56:26 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2020-05-02 14:56:26 -0400 |
commit | 9bfd14efd09cfafa0cf7d7896e663ed392c96ff7 (patch) | |
tree | 6e544b3605f1106387053d27dd09ecac79f2e96e /src/bin | |
parent | db068a8eb136b53766bb682aa7fb73b8db53674b (diff) | |
download | rbw-9bfd14efd09cfafa0cf7d7896e663ed392c96ff7.tar.gz rbw-9bfd14efd09cfafa0cf7d7896e663ed392c96ff7.zip |
don't kill the agent if it fails to parse a message
Diffstat (limited to 'src/bin')
-rw-r--r-- | src/bin/rbw-agent/agent.rs | 9 | ||||
-rw-r--r-- | src/bin/rbw-agent/sock.rs | 9 |
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) + })) } } |