Avoid duplicating unilateral response handling

This commit is contained in:
Jon Gjengset 2019-03-18 21:43:30 -04:00
parent b0ac079c30
commit c0e1fbba0c
No known key found for this signature in database
GPG key ID: F8FBEB3BC15B735B

View file

@ -45,33 +45,11 @@ where
match map(resp)? { match map(resp)? {
MapOrNot::Map(t) => things.push(t), MapOrNot::Map(t) => things.push(t),
MapOrNot::Not(resp) => { MapOrNot::Not(resp) => match handle_unilateral(resp, unsolicited) {
// check if this is simply a unilateral server response Some(Response::Fetch(..)) => continue,
// (see Section 7 of RFC 3501): Some(resp) => break Err(resp.into()),
match resp { None => {}
Response::MailboxData(MailboxDatum::Recent(n)) => { },
unsolicited.send(UnsolicitedResponse::Recent(n)).unwrap();
}
Response::MailboxData(MailboxDatum::Exists(n)) => {
unsolicited.send(UnsolicitedResponse::Exists(n)).unwrap();
}
Response::Expunge(id) => {
unsolicited.send(UnsolicitedResponse::Expunge(id)).unwrap();
}
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => {
unsolicited
.send(UnsolicitedResponse::Status {
mailbox: mailbox.into(),
attributes: status,
})
.unwrap();
}
Response::Fetch(..) => {
continue;
}
resp => break Err(resp.into()),
}
}
MapOrNot::Ignore => continue, MapOrNot::Ignore => continue,
} }
} }
@ -168,27 +146,8 @@ pub fn parse_capabilities(
} }
Ok((rest, data)) => { Ok((rest, data)) => {
lines = rest; lines = rest;
match data { if let Some(resp) = handle_unilateral(data, unsolicited) {
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => { break Err(resp.into());
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());
}
} }
} }
_ => { _ => {
@ -219,27 +178,8 @@ pub fn parse_noop(
match imap_proto::parse_response(lines) { match imap_proto::parse_response(lines) {
Ok((rest, data)) => { Ok((rest, data)) => {
lines = rest; lines = rest;
match data { if let Some(resp) = handle_unilateral(data, unsolicited) {
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => { break Err(resp.into());
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());
}
} }
} }
_ => { _ => {
@ -348,27 +288,8 @@ pub fn parse_ids(
} }
Ok((rest, data)) => { Ok((rest, data)) => {
lines = rest; lines = rest;
match data { if let Some(resp) = handle_unilateral(data, unsolicited) {
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => { break Err(resp.into());
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());
}
} }
} }
_ => { _ => {
@ -378,6 +299,37 @@ pub fn parse_ids(
} }
} }
// check if this is simply a unilateral server response
// (see Section 7 of RFC 3501):
fn handle_unilateral<'a>(
res: Response<'a>,
unsolicited: &mut mpsc::Sender<UnsolicitedResponse>,
) -> Option<Response<'a>> {
match res {
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();
}
res => {
return Some(res);
}
}
None
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;