From ce45cf5f1747fbcf12eb0ba4a45610b8b24ee4f2 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Sat, 1 Aug 2020 23:53:45 +0300 Subject: [PATCH] melib/{imap,nntp}: flush after write_all IMAP IDLE got stuck, because the IDLE connection used `send_raw` that didn't flush output after `write_all`, *if* DEFLATE was on. DEFLATE needs to flush output. --- melib/src/backends/imap/connection.rs | 6 ++++++ melib/src/backends/nntp/connection.rs | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/melib/src/backends/imap/connection.rs b/melib/src/backends/imap/connection.rs index 72d5f5510..4e29e4338 100644 --- a/melib/src/backends/imap/connection.rs +++ b/melib/src/backends/imap/connection.rs @@ -142,6 +142,10 @@ impl ImapStream { .chain_err_kind(crate::error::ErrorKind::Network)?; } } + socket + .flush() + .await + .chain_err_kind(crate::error::ErrorKind::Network)?; let mut response = String::with_capacity(1024); let mut broken = false; let now = std::time::Instant::now(); @@ -452,6 +456,7 @@ impl ImapStream { if let Err(err) = try_await(async move { self.stream.write_all(data).await?; self.stream.write_all(b"\r\n").await?; + self.stream.flush().await?; Ok(()) }) .await @@ -466,6 +471,7 @@ impl ImapStream { if let Err(err) = try_await(async move { self.stream.write_all(raw).await?; self.stream.write_all(b"\r\n").await?; + self.stream.flush().await?; Ok(()) }) .await diff --git a/melib/src/backends/nntp/connection.rs b/melib/src/backends/nntp/connection.rs index 2c62b281c..4f9ad43aa 100644 --- a/melib/src/backends/nntp/connection.rs +++ b/melib/src/backends/nntp/connection.rs @@ -138,6 +138,10 @@ impl NntpStream { .write_all(b"STARTTLS\r\n") .await .chain_err_kind(crate::error::ErrorKind::Network)?; + ret.stream + .flush() + .await + .chain_err_kind(crate::error::ErrorKind::Network)?; ret.read_response(&mut res, false).await?; if !res.starts_with("382 ") { return Err(MeliError::new(format!(