X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiMain.php;h=554bfa67408234a6b7f08412fa742148d79791b4;hb=26fcab1f18c568a41bf4b25d86067434593a87cb;hp=e1c087474fea8750ec122786503e9f65d2dacc5b;hpb=b382dfd42b6fc67a8df6e4b82da982dc46940b29;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index e1c087474f..554bfa6740 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -147,9 +147,9 @@ class ApiMain extends ApiBase { /** * Constructs an instance of ApiMain that utilizes the module and format specified by $request. * - * @param $context IContextSource|WebRequest - if this is an instance of + * @param IContextSource|WebRequest $context If this is an instance of * FauxRequest, errors are thrown and no printing occurs - * @param bool $enableWrite should be set to true if the api may modify data + * @param bool $enableWrite Should be set to true if the api may modify data */ public function __construct( $context = null, $enableWrite = false ) { if ( $context === null ) { @@ -238,7 +238,7 @@ class ApiMain extends ApiBase { /** * Set how long the response should be cached. * - * @param $maxage + * @param int $maxage */ public function setCacheMaxAge( $maxage ) { $this->setCacheControl( array( @@ -301,7 +301,7 @@ class ApiMain extends ApiBase { * Cache control values set here will only be used if the cache mode is not * private, see setCacheMode(). * - * @param $directives array + * @param array $directives */ public function setCacheControl( $directives ) { $this->mCacheControl = $directives + $this->mCacheControl; @@ -310,7 +310,7 @@ class ApiMain extends ApiBase { /** * Create an instance of an output formatter by its name * - * @param $format string + * @param string $format * * @return ApiFormatBase */ @@ -386,6 +386,12 @@ class ApiMain extends ApiBase { * @param Exception $e */ protected function handleException( Exception $e ) { + // Bug 63145: Rollback any open database transactions + if ( !( $e instanceof UsageException ) ) { + // UsageExceptions are intentional, so don't rollback if that's the case + MWExceptionHandler::rollbackMasterChangesAndLog( $e ); + } + // Allow extra cleanup and logging wfRunHooks( 'ApiMain::onException', array( $this, $e ) ); @@ -634,13 +640,14 @@ class ApiMain extends ApiBase { /** * Replace the result data with the information about an exception. * Returns the error code - * @param $e Exception + * @param Exception $e * @return string */ protected function substituteResultWithError( $e ) { global $wgShowHostnames; $result = $this->getResult(); + // Printer may not be initialized if the extractRequestParams() fails for the main module if ( !isset( $this->mPrinter ) ) { // The printer has not been created yet. Try to manually get formatter value. @@ -650,11 +657,18 @@ class ApiMain extends ApiBase { } $this->mPrinter = $this->createPrinterByName( $value ); - if ( $this->mPrinter->getNeedsRawData() ) { - $result->setRawMode(); - } } + // Printer may not be able to handle errors. This is particularly + // likely if the module returns something for getCustomPrinter(). + if ( !$this->mPrinter->canPrintErrors() ) { + $this->mPrinter->safeProfileOut(); + $this->mPrinter = $this->createPrinterByName( self::API_DEFAULT_FORMAT ); + } + + // Update raw mode flag for the selected printer. + $result->setRawMode( $this->mPrinter->getNeedsRawData() ); + if ( $e instanceof UsageException ) { // User entered incorrect parameters - print usage screen $errMessage = $e->getMessageArray(); @@ -771,9 +785,9 @@ class ApiMain extends ApiBase { /** * Check the max lag if necessary - * @param $module ApiBase object: Api module being used - * @param array $params an array containing the request parameters. - * @return boolean True on success, false should exit immediately + * @param ApiBase $module Api module being used + * @param array $params Array an array containing the request parameters. + * @return bool True on success, false should exit immediately */ protected function checkMaxLag( $module, $params ) { if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) { @@ -800,7 +814,7 @@ class ApiMain extends ApiBase { /** * Check for sufficient permissions to execute - * @param $module ApiBase An Api module + * @param ApiBase $module An Api module */ protected function checkExecutePermissions( $module ) { $user = $this->getUser(); @@ -830,7 +844,7 @@ class ApiMain extends ApiBase { /** * Check asserts of the user's rights - * @param $params array + * @param array $params */ protected function checkAsserts( $params ) { if ( isset( $params['assert'] ) ) { @@ -852,7 +866,7 @@ class ApiMain extends ApiBase { /** * Check POST for external response and setup result printer - * @param $module ApiBase An Api module + * @param ApiBase $module An Api module * @param array $params an array with the request parameters */ protected function setupExternalResponse( $module, $params ) { @@ -942,6 +956,8 @@ class ApiMain extends ApiBase { /** * Encode a value in a format suitable for a space-separated log line. + * @param string $s + * return string */ protected function encodeRequestLogValue( $s ) { static $table; @@ -958,6 +974,7 @@ class ApiMain extends ApiBase { /** * Get the request parameters used in the course of the preceding execute() request + * @return array */ protected function getParamsUsed() { return array_keys( $this->mParamsUsed ); @@ -965,21 +982,35 @@ class ApiMain extends ApiBase { /** * Get a request value, and register the fact that it was used, for logging. + * @param string $name + * @param mixed $default + * @return mixed */ public function getVal( $name, $default = null ) { $this->mParamsUsed[$name] = true; - return $this->getRequest()->getVal( $name, $default ); + $ret = $this->getRequest()->getVal( $name ); + if ( $ret === null ) { + if ( $this->getRequest()->getArray( $name ) !== null ) { + // See bug 10262 for why we don't just join( '|', ... ) the + // array. + $this->setWarning( + "Parameter '$name' uses unsupported PHP array syntax" + ); + } + $ret = $default; + } + return $ret; } /** * Get a boolean request value, and register the fact that the parameter * was used, for logging. + * @param string $name + * @return bool */ public function getCheck( $name ) { - $this->mParamsUsed[$name] = true; - - return $this->getRequest()->getCheck( $name ); + return $this->getVal( $name, null ) !== null; } /** @@ -1023,7 +1054,7 @@ class ApiMain extends ApiBase { /** * Print results using the current printer * - * @param $isError bool + * @param bool $isError */ protected function printResult( $isError ) { global $wgDebugAPI; @@ -1213,7 +1244,7 @@ class ApiMain extends ApiBase { /** * Sets whether the pretty-printer should format *bold* and $italics$ * - * @param $help bool + * @param bool $help */ public function setHelp( $help = true ) { $this->mPrinter->setHelp( $help ); @@ -1291,7 +1322,7 @@ class ApiMain extends ApiBase { } /** - * @param $module ApiBase + * @param ApiBase $module * @param string $paramName What type of request is this? e.g. action, * query, list, prop, meta, format * @return string @@ -1345,7 +1376,7 @@ class ApiMain extends ApiBase { * * @deprecated since 1.21, Use getModuleManager()->addModule() instead. * @param string $name The identifier for this module. - * @param $class ApiBase The class where this module is implemented. + * @param ApiBase $class The class where this module is implemented. */ protected function addModule( $name, $class ) { $this->getModuleManager()->addModule( $name, 'action', $class ); @@ -1357,7 +1388,7 @@ class ApiMain extends ApiBase { * * @deprecated since 1.21, Use getModuleManager()->addModule() instead. * @param string $name The identifier for this format. - * @param $class ApiFormatBase The class implementing this format. + * @param ApiFormatBase $class The class implementing this format. */ protected function addFormat( $name, $class ) { $this->getModuleManager()->addModule( $name, 'format', $class ); @@ -1400,10 +1431,10 @@ class UsageException extends MWException { private $mExtraData; /** - * @param $message string - * @param $codestr string - * @param $code int - * @param $extradata array|null + * @param string $message + * @param string $codestr + * @param int $code + * @param array|null $extradata */ public function __construct( $message, $codestr, $code = 0, $extradata = null ) { parent::__construct( $message, $code );