X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiFormatJson.php;h=43877b784b984a871d179802b43a04a1ea91dc5e;hb=64717f414cdd66a27630b92539cde5456d622141;hp=ce8656e221e1cd6f4c2fb6dcddcafef7b480c011;hpb=15e557215c628a9dadefef57e75dee4dead21807;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php index ce8656e221..43877b784b 100644 --- a/includes/api/ApiFormatJson.php +++ b/includes/api/ApiFormatJson.php @@ -30,25 +30,28 @@ */ class ApiFormatJson extends ApiFormatBase { - private $mIsRaw; + private $isRaw; public function __construct( ApiMain $main, $format ) { parent::__construct( $main, $format ); - $this->mIsRaw = ( $format === 'rawfm' ); + $this->isRaw = ( $format === 'rawfm' ); } public function getMimeType() { $params = $this->extractRequestParams(); // callback: - if ( $params['callback'] ) { + if ( isset( $params['callback'] ) ) { return 'text/javascript'; } return 'application/json'; } + /** + * @deprecated since 1.25 + */ public function getNeedsRawData() { - return $this->mIsRaw; + return $this->isRaw; } /** @@ -62,14 +65,49 @@ class ApiFormatJson extends ApiFormatBase { public function execute() { $params = $this->extractRequestParams(); - $json = FormatJson::encode( - $this->getResultData(), - $this->getIsHtml(), - $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK - ); - $callback = $params['callback']; - if ( $callback !== null ) { - $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback ); + + $opt = 0; + if ( $this->isRaw ) { + $opt |= FormatJson::ALL_OK; + $transform = array(); + } else { + switch ( $params['formatversion'] ) { + case 1: + $opt |= $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK; + $transform = array( + 'BC' => array(), + 'Types' => array( 'AssocAsObject' => true ), + 'Strip' => 'all', + ); + break; + + case 2: + case 'latest': + $opt |= $params['ascii'] ? FormatJson::XMLMETA_OK : FormatJson::ALL_OK; + $transform = array( + 'Types' => array( 'AssocAsObject' => true ), + 'Strip' => 'all', + ); + break; + + default: + $this->dieUsage( __METHOD__ . ': Unknown value for \'formatversion\'', 'unknownformatversion' ); + } + } + $data = $this->getResult()->getResultData( null, $transform ); + $json = FormatJson::encode( $data, $this->getIsHtml(), $opt ); + + // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in + // Flash, but what it does isn't friendly for the API, so we need to + // work around it. + if ( preg_match( '/\<\s*cross-domain-policy\s*\>/i', $json ) ) { + $json = preg_replace( + '/\<(\s*cross-domain-policy\s*)\>/i', '\\u003C$1\\u003E', $json + ); + } + + if ( isset( $params['callback'] ) ) { + $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $params['callback'] ); # Prepend a comment to try to avoid attacks against content # sniffers, such as bug 68187. $this->printText( "/**/$callback($json)" ); @@ -79,7 +117,11 @@ class ApiFormatJson extends ApiFormatBase { } public function getAllowedParams() { - return array( + if ( $this->isRaw ) { + return array(); + } + + $ret = array( 'callback' => array( ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-callback', ), @@ -87,6 +129,16 @@ class ApiFormatJson extends ApiFormatBase { ApiBase::PARAM_DFLT => false, ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-utf8', ), + 'ascii' => array( + ApiBase::PARAM_DFLT => false, + ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-ascii', + ), + 'formatversion' => array( + ApiBase::PARAM_TYPE => array( 1, 2, 'latest' ), + ApiBase::PARAM_DFLT => 1, + ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-formatversion', + ), ); + return $ret; } }