Add support for limited error handling for json encoding errors (requires PHP 5.3+)
authorMichael M Slusarz <slusarz@curecanti.org>
Thu, 4 Mar 2010 18:38:35 +0000 (11:38 -0700)
committerMichael M Slusarz <slusarz@curecanti.org>
Thu, 4 Mar 2010 19:21:35 +0000 (12:21 -0700)
framework/Serialize/lib/Horde/Serialize.php
framework/Serialize/package.xml
framework/Serialize/test/Horde/Serialize/fixtures/badutf8.txt [new file with mode: 0644]
framework/Serialize/test/Horde/Serialize/json_encode_badutf8.phpt [new file with mode: 0644]

index 57fdbc1..217285e 100644 (file)
@@ -254,10 +254,20 @@ class Horde_Serialize
 
         // $params = Source character set
         case self::JSON:
-            if (!empty($params)) {
+            if (!empty($params) && is_string($data)) {
                 $data = Horde_String::convertCharset($data, $params, 'UTF-8');
             }
-            $data = json_encode($data);
+            $tmp = json_encode($data);
+
+            /* Basic error handling attempts. Requires PHP 5.3+.
+             * Error code 5, although not documented, indicates non UTF-8
+             * data. */
+            if (function_exists('json_last_error') &&
+                (json_last_error() == 5)) {
+                $data = json_encode(Horde_Util::convertToUtf8($data));
+            } else {
+                $data = $tmp;
+            }
             break;
 
         case self::LZF:
index ead3ce3..8d0b875 100644 (file)
@@ -31,7 +31,9 @@ http://pear.php.net/dtd/package-2.0.xsd">
   <api>beta</api>
  </stability>
  <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
- <notes>* Initial Horde 4 package.</notes>
+ <notes>* Add support for limited error handling for json encoding errors
+ (requires PHP 5.3+).
+ * Initial Horde 4 package.</notes>
  <contents>
   <dir name="/">
    <dir name="lib">
diff --git a/framework/Serialize/test/Horde/Serialize/fixtures/badutf8.txt b/framework/Serialize/test/Horde/Serialize/fixtures/badutf8.txt
new file mode 100644 (file)
index 0000000..4cfaadc
--- /dev/null
@@ -0,0 +1 @@
+Note: To play video messages sent to email, QuickTime® 6.5 or higher is required.
diff --git a/framework/Serialize/test/Horde/Serialize/json_encode_badutf8.phpt b/framework/Serialize/test/Horde/Serialize/json_encode_badutf8.phpt
new file mode 100644 (file)
index 0000000..0ed4810
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+JSON encode/decode tests (invalid UTF-8 input).
+--SKIPIF--
+<?php
+    if (version_compare(phpversion(), '5.3.0') == -1) {
+        echo "skip Test requires PHP 5.3+";
+    }
+?>
+--FILE--
+<?php
+
+error_reporting(E_ALL);
+
+require dirname(__FILE__) . '/../../../lib/Horde/Serialize.php';
+require dirname(__FILE__) . '/../../../../Util/lib/Horde/String.php';
+require dirname(__FILE__) . '/../../../../Util/lib/Horde/Util.php';
+
+echo Horde_Serialize::serialize(file_get_contents('./fixtures/badutf8.txt'), Horde_Serialize::JSON);
+
+?>
+--EXPECT--
+"Note: To play video messages sent to email, QuickTime\u00ae 6.5 or higher is required.\n"