summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2020-07-23 21:47:19 +0300
committerManos Pitsidianakis <el13635@mail.ntua.gr>2020-07-25 15:17:35 +0300
commit1b8529c59c3fab6475b0fe3ebb03fa9f2747fc45 (patch)
tree03c9639da4e1dd7b8decac2e96756ff612f11275
parentf9efaea0ec2f82442eb633962b170855ff853a57 (diff)
melib/imap: use LITERAL+ with APPEND
Closes #50
-rw-r--r--melib/src/backends/imap.rs42
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?;