alecpl
2011-10-11 52c2aa3ea50cf7cd93b8c3fc553d7c24974e7c44
- Fix FETCH response parsing in fetchMIMEHeaders() method (first line of headers was malformed)


1 files modified
29 ■■■■■ changed files
program/include/rcube_imap_generic.php 29 ●●●●● patch | view | raw | blame | history
program/include/rcube_imap_generic.php
@@ -2300,12 +2300,11 @@
        $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 @@
        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));