From 5df075944680360b00b786b75d3df780c1b36826 Mon Sep 17 00:00:00 2001 From: Emmanuel Lesueur Date: Sat, 16 Mar 2019 13:31:52 +0100 Subject: [PATCH] Handle unsolicited responses in noop. --- src/client.rs | 3 ++- src/parse.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/client.rs b/src/client.rs index f893d0f..a87d3d8 100644 --- a/src/client.rs +++ b/src/client.rs @@ -507,7 +507,8 @@ impl Session { /// Noop always succeeds, and it does nothing. pub fn noop(&mut self) -> Result<()> { - self.run_command_and_check_ok("NOOP") + self.run_command_and_read_response("NOOP") + .and_then(|lines| parse_noop(lines, &mut self.unsolicited_responses_tx)) } /// Logout informs the server that the client is done with the connection. diff --git a/src/parse.rs b/src/parse.rs index 9161898..efc48c9 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -205,6 +205,50 @@ pub fn parse_capabilities( unsafe { ZeroCopy::make(lines, f) } } +pub fn parse_noop( + lines: Vec, + unsolicited: &mut mpsc::Sender, +) -> Result<()> { + let mut lines: &[u8] = &lines; + + loop { + if lines.is_empty() { + break Ok(()); + } + + match imap_proto::parse_response(lines) { + Ok((rest, data)) => { + lines = rest; + match data { + Response::MailboxData(MailboxDatum::Status { mailbox, status }) => { + unsolicited + .send(UnsolicitedResponse::Status { + mailbox: mailbox.into(), + attributes: status, + }) + .unwrap(); + } + Response::MailboxData(MailboxDatum::Recent(n)) => { + unsolicited.send(UnsolicitedResponse::Recent(n)).unwrap(); + } + Response::MailboxData(MailboxDatum::Exists(n)) => { + unsolicited.send(UnsolicitedResponse::Exists(n)).unwrap(); + } + Response::Expunge(n) => { + unsolicited.send(UnsolicitedResponse::Expunge(n)).unwrap(); + } + resp => { + break Err(resp.into()); + } + } + } + _ => { + break Err(Error::Parse(ParseError::Invalid(lines.to_vec()))); + } + } + } +} + pub fn parse_mailbox( mut lines: &[u8], unsolicited: &mut mpsc::Sender,