From df7b8d75acbc3865833c35998293e4584c399866 Mon Sep 17 00:00:00 2001 From: x2003bruneau Date: Fri, 3 Mar 2006 17:10:21 +0000 Subject: [PATCH] =?utf8?q?=3D=3Futf-8=3Fq=3F*=3D20Gestion=3D20des=3D20mult?= =?utf8?q?ipart=3D20imbriqu=3DC3=3D83=3DC2=3DA9es?= =20*=20Gestion=20du=20multipart=20alternative=20(tout=20le=20reste=20=C3=83=C2=A9tant=20g=C3=83=C2=A9r=C3=83=C2=A9=20comme=20du=20mixed)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit git-svn-id: svn+ssh://murphy/home/svn/banana/trunk@24 9869982d-c50d-0410-be91-f2a2ec7c7c7b --- banana/post.inc.php | 75 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/banana/post.inc.php b/banana/post.inc.php index d8ff6d0..20ab505 100644 --- a/banana/post.inc.php +++ b/banana/post.inc.php @@ -49,10 +49,10 @@ class BananaPost } } - if (preg_match("@multipart/([^;]+);@", $this->headers['content-type'], $mpart_type)) { - preg_match("/boundary=\"?([^ \"]+)\"?/", $this->headers['content-type'], $mpart_boundary); - $this->_split_multipart($mpart_type[1], $mpart_boundary[1]); + if ($this->_split_multipart($this->headers, $this->body)) { + $this->set_body_to_part(0); } else { + $this->_split_multipart($mpart_type[1], $mpart_boundary[1]); $this->_find_uuencode(); if (preg_match('!charset=([^;]*)\s*(;|$)!', $this->headers['content-type'], $matches)) { $this->body = iconv($matches[1], 'utf-8', $this->body); @@ -85,20 +85,45 @@ class BananaPost * @param $type STRING multipart type description * @param $boundary STRING multipart boundary identification string */ - function _split_multipart($type, $boundary) + function _split_multipart($headers, $body) { - $parts = preg_split("/\n--$boundary(--|\n)/", $this->body); + if (!preg_match("@multipart/([^;]+);@", $headers['content-type'], $type)) { + return false; + } + + preg_match("/boundary=\"?([^ \"]+)\"?/", $headers['content-type'], $boundary); + $boundary = $boundary[1]; + $type = $type[1]; + $parts = preg_split("@\n--$boundary(--|\n)@", $body); foreach ($parts as $part) { - $part = $this->_get_part($part); + $part = $this->_get_part($part); $local_header = $part['headers']; - $local_body = $part['body']; - if (isset($local_header['content-disposition']) && preg_match("/attachment/", $local_header['content-disposition'])) { - $this->_add_attachment($part); - } else if (isset($local_header['content-type']) && preg_match("@text/([^;]+);@", $local_header['content-type'], $format)) { - array_push($this->messages, $part); + $local_body = $part['body']; + if (!$this->_split_multipart($local_header, $local_body)) { + $is_text = isset($local_header['content-type']) && preg_match("@text/([^;]+);@", $local_header['content-type']) + && (!isset($local_header['content-disposition']) || !preg_match('@attachment@', $local_header['content-disposition'])); + + // alternative ==> multiple formats for messages + if ($type == 'alternative' && $is_text) { + array_push($this->messages, $part); + + // !alternative ==> une body, others are attachments + } else if ($is_text) { + if (count($this->messages) == 0) { + $this->body = $local_body; + foreach (array_keys($local_header) as $key) { + $this->header[$key] = $local_header[$key]; + } + array_push($this->messages, $part); + } else { + $this->_add_attachment($part); + } + } else { + $this->_add_attachment($part); + } } } - $this->set_body_to_part(0); + return true; } /** extract new headers from the part @@ -112,10 +137,14 @@ class BananaPost while (count($lines)) { $line = array_shift($lines); if ($line != "") { - list($hdr, $val) = split(":[ \t\r]*", $line, 2); - $hdr = strtolower($hdr); - if (in_array($hdr, $banana->parse_hdr)) { - $local_headers[$hdr] = $val; + if (preg_match('@^[\t\r ]+@', $line) && isset($hdr)) { + $local_headers[$hdr] .= ' '.trim($line); + } else { + list($hdr, $val) = split(":[ \t\r]*", $line, 2); + $hdr = strtolower($hdr); + if (in_array($hdr, $banana->parse_hdr)) { + $local_headers[$hdr] = $val; + } } } else { break; @@ -131,16 +160,10 @@ class BananaPost $local_header = $part['headers']; $local_body = $part['body']; - if (!isset($local_header['content-transfer-encoding'])) { - return false; - } - - if (isset($local_header['content-disposition'])) { - if (preg_match("/attachment/", $local_header['content-disposition'])) { - preg_match("/filename=\"?([^\"]+)\"?/", $local_header['content-disposition'], $filename); - $filename = $filename[1]; - } - } + if ((isset($local_header['content-disposition']) && preg_match("/filename=\"?([^\"]+)\"?/", $local_header['content-disposition'], $filename)) + || (isset($local_header['content-type']) && preg_match("/name=\"?([^\"]+)\"?/", $local_header['content-type'], $filename))) { + $filename = $filename[1]; + } if (!isset($filename)) { $filename = "attachment".count($pj); } -- 2.1.4