diff options
author | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2020-07-23 21:47:19 +0300 |
---|---|---|
committer | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2020-07-25 15:17:35 +0300 |
commit | 1b8529c59c3fab6475b0fe3ebb03fa9f2747fc45 (patch) | |
tree | 03c9639da4e1dd7b8decac2e96756ff612f11275 | |
parent | f9efaea0ec2f82442eb633962b170855ff853a57 (diff) |
melib/imap: use LITERAL+ with APPEND
Closes #50
-rw-r--r-- | melib/src/backends/imap.rs | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index dbee1fd4..33711af7 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -65,6 +65,7 @@ pub static SUPPORTED_CAPABILITIES: &[&str] = &[ "IMAP4REV1", "SPECIAL-USE", "UNSELECT", + "LITERAL+", ]; #[derive(Debug, Default)] @@ -407,18 +408,37 @@ impl MailBackend for ImapType { let mut response = String::with_capacity(8 * 1024); let mut conn = connection.lock().await; let flags = flags.unwrap_or_else(Flag::empty); - conn.send_command( - format!( - "APPEND \"{}\" ({}) {{{}}}", - &path, - flags_to_imap_list!(flags), - bytes.len() + let has_literal_plus: bool = uid_store + .capabilities + .lock() + .unwrap() + .iter() + .any(|cap| cap.eq_ignore_ascii_case(b"LITERAL+")); + if has_literal_plus { + conn.send_command( + format!( + "APPEND \"{}\" ({}) {{{}+}}", + &path, + flags_to_imap_list!(flags), + bytes.len() + ) + .as_bytes(), ) - .as_bytes(), - ) - .await?; - // wait for "+ Ready for literal data" reply - conn.wait_for_continuation_request().await?; + .await?; + } else { + conn.send_command( + format!( + "APPEND \"{}\" ({}) {{{}}}", + &path, + flags_to_imap_list!(flags), + bytes.len() + ) + .as_bytes(), + ) + .await?; + // wait for "+ Ready for literal data" reply + conn.wait_for_continuation_request().await?; + } conn.send_literal(&bytes).await?; conn.read_response(&mut response, RequiredResponses::empty()) .await?; |