diff options
author | alecpl <alec@alec.pl> | 2011-10-11 08:36:50 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2011-10-11 08:36:50 +0000 |
commit | 52c2aa3ea50cf7cd93b8c3fc553d7c24974e7c44 (patch) | |
tree | 7d8a58a4e2b347eb93882311b056fa55487efe28 /program | |
parent | dc6c4f4a28652f428a507b0335f418749cdbc3bd (diff) |
- Fix FETCH response parsing in fetchMIMEHeaders() method (first line of headers was malformed)
Diffstat (limited to 'program')
-rw-r--r-- | program/include/rcube_imap_generic.php | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php index a25413c11..bcfaa812e 100644 --- a/program/include/rcube_imap_generic.php +++ b/program/include/rcube_imap_generic.php @@ -2300,12 +2300,11 @@ class rcube_imap_generic $result = false; $parts = (array) $parts; $key = $this->nextTag(); - $peeks = ''; - $idx = 0; + $peeks = array(); $type = $mime ? 'MIME' : 'HEADER'; // format request - foreach($parts as $part) { + foreach ($parts as $part) { $peeks[] = "BODY.PEEK[$part.$type]"; } @@ -2319,13 +2318,25 @@ class rcube_imap_generic do { $line = $this->readLine(1024); - $line = $this->multLine($line); - if (preg_match('/BODY\[([0-9\.]+)\.'.$type.'\]/', $line, $matches)) { - $idx = $matches[1]; - $result[$idx] = preg_replace('/^(\* [0-9]+ FETCH \()?\s*BODY\['.$idx.'\.'.$type.'\]\s+/', '', $line); - $result[$idx] = trim($result[$idx], '"'); - $result[$idx] = rtrim($result[$idx], "\t\r\n\0\x0B"); + if (preg_match('/^\* [0-9]+ FETCH [0-9UID( ]+BODY\[([0-9\.]+)\.'.$type.'\]/', $line, $matches)) { + $idx = $matches[1]; + $headers = ''; + + // get complete entry + if (preg_match('/\{([0-9]+)\}\r\n$/', $line, $m)) { + $bytes = $m[1]; + $out = ''; + + while (strlen($out) < $bytes) { + $out = $this->readBytes($bytes); + if ($out === null) + break; + $headers .= $out; + } + } + + $result[$idx] = trim($headers); } } while (!$this->startsWith($line, $key, true)); |