summaryrefslogtreecommitdiff
path: root/includes/api/ApiFormatWddx.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/api/ApiFormatWddx.php')
-rw-r--r--includes/api/ApiFormatWddx.php48
1 files changed, 39 insertions, 9 deletions
diff --git a/includes/api/ApiFormatWddx.php b/includes/api/ApiFormatWddx.php
index ba90c260..ec3dc2d9 100644
--- a/includes/api/ApiFormatWddx.php
+++ b/includes/api/ApiFormatWddx.php
@@ -38,15 +38,7 @@ class ApiFormatWddx extends ApiFormatBase {
public function execute() {
$this->markDeprecated();
- // Some versions of PHP have a broken wddx_serialize_value, see
- // PHP bug 45314. Test encoding an affected character (U+00A0)
- // to avoid this.
- $expected =
- "<wddxPacket version='1.0'><header/><data><string>\xc2\xa0</string></data></wddxPacket>";
- if ( function_exists( 'wddx_serialize_value' )
- && !$this->getIsHtml()
- && wddx_serialize_value( "\xc2\xa0" ) == $expected
- ) {
+ if ( !$this->getIsHtml() && !static::useSlowPrinter() ) {
$this->printText( wddx_serialize_value( $this->getResultData() ) );
} else {
// Don't do newlines and indentation if we weren't asked
@@ -63,6 +55,44 @@ class ApiFormatWddx extends ApiFormatBase {
}
}
+ public static function useSlowPrinter() {
+ if ( !function_exists( 'wddx_serialize_value' ) ) {
+ return true;
+ }
+
+ // Some versions of PHP have a broken wddx_serialize_value, see
+ // PHP bug 45314. Test encoding an affected character (U+00A0)
+ // to avoid this.
+ $expected =
+ "<wddxPacket version='1.0'><header/><data><string>\xc2\xa0</string></data></wddxPacket>";
+ if ( wddx_serialize_value( "\xc2\xa0" ) !== $expected ) {
+ return true;
+ }
+
+ // Some versions of HHVM don't correctly encode ampersands.
+ $expected =
+ "<wddxPacket version='1.0'><header/><data><string>&amp;</string></data></wddxPacket>";
+ if ( wddx_serialize_value( '&' ) !== $expected ) {
+ return true;
+ }
+
+ // Some versions of HHVM don't correctly encode empty arrays as subvalues.
+ $expected =
+ "<wddxPacket version='1.0'><header/><data><array length='1'><array length='0'></array></array></data></wddxPacket>";
+ if ( wddx_serialize_value( array( array() ) ) !== $expected ) {
+ return true;
+ }
+
+ // Some versions of HHVM don't correctly encode associative arrays with numeric keys.
+ $expected =
+ "<wddxPacket version='1.0'><header/><data><struct><var name='2'><number>1</number></var></struct></data></wddxPacket>";
+ if ( wddx_serialize_value( array( 2 => 1 ) ) !== $expected ) {
+ return true;
+ }
+
+ return false;
+ }
+
/**
* Recursively go through the object and output its data in WDDX format.
* @param mixed $elemValue