From a5ad8f29c380ada137893bcafb329ed346c0bcce Mon Sep 17 00:00:00 2001 From: Michael M Slusarz Date: Thu, 4 Mar 2010 11:38:35 -0700 Subject: [PATCH] Add support for limited error handling for json encoding errors (requires PHP 5.3+) --- framework/Serialize/lib/Horde/Serialize.php | 14 ++++++++++++-- framework/Serialize/package.xml | 4 +++- .../test/Horde/Serialize/fixtures/badutf8.txt | 1 + .../test/Horde/Serialize/json_encode_badutf8.phpt | 22 ++++++++++++++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 framework/Serialize/test/Horde/Serialize/fixtures/badutf8.txt create mode 100644 framework/Serialize/test/Horde/Serialize/json_encode_badutf8.phpt diff --git a/framework/Serialize/lib/Horde/Serialize.php b/framework/Serialize/lib/Horde/Serialize.php index 57fdbc14c..217285ee8 100644 --- a/framework/Serialize/lib/Horde/Serialize.php +++ b/framework/Serialize/lib/Horde/Serialize.php @@ -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: diff --git a/framework/Serialize/package.xml b/framework/Serialize/package.xml index ead3ce3ae..8d0b87553 100644 --- a/framework/Serialize/package.xml +++ b/framework/Serialize/package.xml @@ -31,7 +31,9 @@ http://pear.php.net/dtd/package-2.0.xsd"> beta LGPL - * Initial Horde 4 package. + * Add support for limited error handling for json encoding errors + (requires PHP 5.3+). + * Initial Horde 4 package. diff --git a/framework/Serialize/test/Horde/Serialize/fixtures/badutf8.txt b/framework/Serialize/test/Horde/Serialize/fixtures/badutf8.txt new file mode 100644 index 000000000..4cfaadc1b --- /dev/null +++ b/framework/Serialize/test/Horde/Serialize/fixtures/badutf8.txt @@ -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 index 000000000..0ed4810e5 --- /dev/null +++ b/framework/Serialize/test/Horde/Serialize/json_encode_badutf8.phpt @@ -0,0 +1,22 @@ +--TEST-- +JSON encode/decode tests (invalid UTF-8 input). +--SKIPIF-- + +--FILE-- + +--EXPECT-- +"Note: To play video messages sent to email, QuickTime\u00ae 6.5 or higher is required.\n" -- 2.11.0