Blob Blame Raw
From ae1adf9f1549f6bb826b541274949cfd0e77457e Mon Sep 17 00:00:00 2001
From: Michael M Slusarz <slusarz@horde.org>
Date: Tue, 13 Jan 2015 03:00:10 -0700
Subject: [PATCH] [mms] Workaround broken in-memory stream filter handling.

Needed to work on PHP 5.5.21+ and 5.6.5+
---
 .../Horde/Imap/Client/Data/Format/Filter/Quote.php | 25 ++++++++++++++++++++--
 framework/Imap_Client/package.xml                  |  4 ++--
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/framework/Imap_Client/lib/Horde/Imap/Client/Data/Format/Filter/Quote.php b/framework/Imap_Client/lib/Horde/Imap/Client/Data/Format/Filter/Quote.php
index a3f1788..3964f69 100644
--- a/framework/Imap_Client/lib/Horde/Imap/Client/Data/Format/Filter/Quote.php
+++ b/framework/Imap_Client/lib/Horde/Imap/Client/Data/Format/Filter/Quote.php
@@ -23,11 +23,28 @@
 class Horde_Imap_Client_Data_Format_Filter_Quote extends php_user_filter
 {
     /**
+     * Has the initial quote been prepended?
+     *
+     * @var boolean
+     */
+    protected $_prepend;
+
+    /**
+     */
+    public function onCreate()
+    {
+        $this->_prepend = false;
+    }
+
+    /**
      * @see stream_filter_register()
      */
     public function filter($in, $out, &$consumed, $closing)
     {
-        stream_bucket_append($out, stream_bucket_new($this->stream, '"'));
+        if (!$this->_prepend) {
+            stream_bucket_append($out, stream_bucket_new($this->stream, '"'));
+            $this->_prepend = true;
+        }
 
         while ($bucket = stream_bucket_make_writeable($in)) {
             $consumed += $bucket->datalen;
@@ -35,7 +52,11 @@ public function filter($in, $out, &$consumed, $closing)
             stream_bucket_append($out, $bucket);
         }
 
-        stream_bucket_append($out, stream_bucket_new($this->stream, '"'));
+        /* feof() call needed due to:
+         * http://news.php.net/php.internals/80363 */
+        if ($closing || feof($this->stream)) {
+            stream_bucket_append($out, stream_bucket_new($this->stream, '"'));
+        }
 
         return PSFS_PASS_ON;
     }