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,29 +146,10 @@ 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 }) => {
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(resp.into());
} }
} }
}
_ => { _ => {
break Err(Error::Parse(ParseError::Invalid(lines.to_vec()))); break Err(Error::Parse(ParseError::Invalid(lines.to_vec())));
} }
@ -219,29 +178,10 @@ 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 }) => {
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(resp.into());
} }
} }
}
_ => { _ => {
break Err(Error::Parse(ParseError::Invalid(lines.to_vec()))); break Err(Error::Parse(ParseError::Invalid(lines.to_vec())));
} }
@ -348,7 +288,24 @@ pub fn parse_ids(
} }
Ok((rest, data)) => { Ok((rest, data)) => {
lines = rest; lines = rest;
match data { if let Some(resp) = handle_unilateral(data, unsolicited) {
break Err(resp.into());
}
}
_ => {
break Err(Error::Parse(ParseError::Invalid(lines.to_vec())));
}
}
}
}
// 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 }) => { Response::MailboxData(MailboxDatum::Status { mailbox, status }) => {
unsolicited unsolicited
.send(UnsolicitedResponse::Status { .send(UnsolicitedResponse::Status {
@ -366,16 +323,11 @@ pub fn parse_ids(
Response::Expunge(n) => { Response::Expunge(n) => {
unsolicited.send(UnsolicitedResponse::Expunge(n)).unwrap(); unsolicited.send(UnsolicitedResponse::Expunge(n)).unwrap();
} }
resp => { res => {
break Err(resp.into()); return Some(res);
}
}
}
_ => {
break Err(Error::Parse(ParseError::Invalid(lines.to_vec())));
}
} }
} }
None
} }
#[cfg(test)] #[cfg(test)]