mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
idle: drain unsolicited response channel
This prevents multiple unsolicited messages from skipping multiple IDLEs. Also skip IDLE only if an EXISTS message was received.
This commit is contained in:
committed by
holger krekel
parent
fc12beda24
commit
cde587fefa
@@ -1,6 +1,7 @@
|
||||
use super::Imap;
|
||||
|
||||
use async_imap::extensions::idle::IdleResponse;
|
||||
use async_imap::types::UnsolicitedResponse;
|
||||
use async_std::prelude::*;
|
||||
use std::time::{Duration, SystemTime};
|
||||
|
||||
@@ -53,13 +54,22 @@ impl Imap {
|
||||
|
||||
if let Some(session) = self.session.take() {
|
||||
// if we have unsolicited responses we directly return
|
||||
if let Ok(res) = session.unsolicited_responses.try_recv() {
|
||||
warn!(context, "skip idle, got unsolicited response {:?}", res);
|
||||
let mut unsolicited_exists = false;
|
||||
while let Ok(response) = session.unsolicited_responses.try_recv() {
|
||||
match response {
|
||||
UnsolicitedResponse::Exists(_) => {
|
||||
warn!(context, "skip idle, got unsolicited EXISTS {:?}", response);
|
||||
unsolicited_exists = true;
|
||||
}
|
||||
_ => info!(context, "ignoring unsolicited response {:?}", response),
|
||||
}
|
||||
}
|
||||
|
||||
if unsolicited_exists {
|
||||
self.session = Some(session);
|
||||
return Ok(info);
|
||||
}
|
||||
|
||||
|
||||
let mut handle = session.idle();
|
||||
if let Err(err) = handle.init().await {
|
||||
return Err(Error::IdleProtocolFailed(err));
|
||||
|
||||
Reference in New Issue
Block a user