Merge pull request #160 from mordak/idle-ok-still-here
Handle Dovecot's periodic IDLE notification messages ("OK Still here").
This commit is contained in:
commit
d6f6615935
1 changed files with 19 additions and 9 deletions
|
|
@ -93,16 +93,26 @@ impl<'a, T: Read + Write + 'a> Handle<'a, T> {
|
|||
/// This is necessary so that we can keep using the inner `Session` in `wait_keepalive`.
|
||||
fn wait_inner(&mut self) -> Result<()> {
|
||||
let mut v = Vec::new();
|
||||
loop {
|
||||
match self.session.readline(&mut v).map(|_| ()) {
|
||||
Err(Error::Io(ref e))
|
||||
if e.kind() == io::ErrorKind::TimedOut || e.kind() == io::ErrorKind::WouldBlock =>
|
||||
if e.kind() == io::ErrorKind::TimedOut
|
||||
|| e.kind() == io::ErrorKind::WouldBlock =>
|
||||
{
|
||||
// we need to refresh the IDLE connection
|
||||
self.terminate()?;
|
||||
self.init()?;
|
||||
self.wait_inner()
|
||||
return self.wait_inner();
|
||||
}
|
||||
r => r,
|
||||
}?;
|
||||
|
||||
// Handle Dovecot's imap_idle_notify_interval message
|
||||
if v.eq_ignore_ascii_case(b"* OK Still here\r\n") {
|
||||
v.clear();
|
||||
} else {
|
||||
break Ok(());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue