diff options
Diffstat (limited to 'includes/api/ApiFormatJson.php')
-rw-r--r-- | includes/api/ApiFormatJson.php | 96 |
1 files changed, 65 insertions, 31 deletions
diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php index d9f9d46a..43877b78 100644 --- a/includes/api/ApiFormatJson.php +++ b/includes/api/ApiFormatJson.php @@ -30,39 +30,72 @@ */ 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; } + /** + * @deprecated since 1.25 + */ public function getWantsHelp() { + wfDeprecated( __METHOD__, '1.25' ); // Help is always ugly in JSON return false; } public function execute() { $params = $this->extractRequestParams(); - $json = FormatJson::encode( - $this->getResultData(), - $this->getIsHtml(), - $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK - ); + + $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 @@ -73,9 +106,8 @@ class ApiFormatJson extends ApiFormatBase { ); } - $callback = $params['callback']; - if ( $callback !== null ) { - $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback ); + 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)" ); @@ -85,26 +117,28 @@ class ApiFormatJson extends ApiFormatBase { } public function getAllowedParams() { - return array( - 'callback' => null, - 'utf8' => false, - ); - } - - public function getParamDescription() { - return array( - 'callback' => 'If specified, wraps the output into a given function ' . - 'call. For safety, all user-specific data will be restricted.', - 'utf8' => 'If specified, encodes most (but not all) non-ASCII ' . - 'characters as UTF-8 instead of replacing them with hexadecimal escape sequences.', - ); - } - - public function getDescription() { - if ( $this->mIsRaw ) { - return 'Output data with the debugging elements in JSON format' . parent::getDescription(); + if ( $this->isRaw ) { + return array(); } - return 'Output data in JSON format' . parent::getDescription(); + $ret = array( + 'callback' => array( + ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-callback', + ), + 'utf8' => array( + 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; } } |