mirror of
https://github.com/chatmail/core.git
synced 2026-05-17 05:46:30 +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 super::Imap;
|
||||||
|
|
||||||
use async_imap::extensions::idle::IdleResponse;
|
use async_imap::extensions::idle::IdleResponse;
|
||||||
|
use async_imap::types::UnsolicitedResponse;
|
||||||
use async_std::prelude::*;
|
use async_std::prelude::*;
|
||||||
use std::time::{Duration, SystemTime};
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
@@ -53,13 +54,22 @@ impl Imap {
|
|||||||
|
|
||||||
if let Some(session) = self.session.take() {
|
if let Some(session) = self.session.take() {
|
||||||
// if we have unsolicited responses we directly return
|
// if we have unsolicited responses we directly return
|
||||||
if let Ok(res) = session.unsolicited_responses.try_recv() {
|
let mut unsolicited_exists = false;
|
||||||
warn!(context, "skip idle, got unsolicited response {:?}", res);
|
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);
|
self.session = Some(session);
|
||||||
return Ok(info);
|
return Ok(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let mut handle = session.idle();
|
let mut handle = session.idle();
|
||||||
if let Err(err) = handle.init().await {
|
if let Err(err) = handle.init().await {
|
||||||
return Err(Error::IdleProtocolFailed(err));
|
return Err(Error::IdleProtocolFailed(err));
|
||||||
|
|||||||
Reference in New Issue
Block a user