=?utf-8?q?*=20Gestion=20des=20multipart=20imbriqu=C3=83=C2=A9es
authorx2003bruneau <x2003bruneau@9869982d-c50d-0410-be91-f2a2ec7c7c7b>
Fri, 3 Mar 2006 17:10:21 +0000 (17:10 +0000)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Fri, 4 Jan 2008 23:34:36 +0000 (00:34 +0100)
=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

index d8ff6d0..20ab505 100644 (file)
@@ -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);
         }