summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2014-10-23 18:53:50 +0200
committerAleksander Machniak <alec@alec.pl>2014-10-23 18:55:05 +0200
commitbf9c9b3e38f984b5cca82d869252900963466b98 (patch)
treefda9afa6169e227d3fa0f7e4f6f590bc8cd08c00
parent81dab388d0aa982f6eecc23dcbfb9afdb17ef2e1 (diff)
Really fix UNKNOWN-CTE handling
-rw-r--r--program/lib/Roundcube/rcube_imap_generic.php25
1 files changed, 13 insertions, 12 deletions
diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php
index a3a76ab2a..63d4f0690 100644
--- a/program/lib/Roundcube/rcube_imap_generic.php
+++ b/program/lib/Roundcube/rcube_imap_generic.php
@@ -2570,6 +2570,7 @@ class rcube_imap_generic
}
$initiated = false;
+ $binary = true;
do {
if (!$initiated) {
@@ -2591,16 +2592,16 @@ class rcube_imap_generic
}
// Use BINARY extension when possible (and safe)
- $binary = !$binary_err && $mode && preg_match('/^[0-9.]+$/', $part) && $this->hasCapability('BINARY');
+ $binary = $binary && $mode && preg_match('/^[0-9.]+$/', $part) && $this->hasCapability('BINARY');
$fetch_mode = $binary ? 'BINARY' : 'BODY';
$partial = $max_bytes ? sprintf('<0.%d>', $max_bytes) : '';
// format request
- $key = $this->nextTag();
- $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id ($fetch_mode.PEEK[$part]$partial)";
- $result = false;
- $found = false;
- $initiated = true;
+ $key = $this->nextTag();
+ $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id ($fetch_mode.PEEK[$part]$partial)";
+ $result = false;
+ $found = false;
+ $initiated = true;
// send request
if (!$this->putLine($request)) {
@@ -2616,16 +2617,16 @@ class rcube_imap_generic
$line = trim($this->readLine(1024));
- // handle UNKNOWN-CTE response - RFC 3516, try standard BODY request instead of BINARY
- if ($binary && preg_match('/^' . $key . ' NO \[UNKNOWN-CTE\]/i', $line)) {
- $initiated = false;
- continue;
- }
-
if (!$line) {
break;
}
+ // handle UNKNOWN-CTE response - RFC 3516, try again with standard BODY request
+ if ($binary && !$found && preg_match('/^' . $key . ' NO \[UNKNOWN-CTE\]/i', $line)) {
+ $binary = $initiated = false;
+ continue;
+ }
+
// skip irrelevant untagged responses (we have a result already)
if ($found || !preg_match('/^\* ([0-9]+) FETCH (.*)$/', $line, $m)) {
continue;