* ApiFeedContributions::feedItemAuthor()
* ApiFeedContributions::feedItemDesc()
* ApiQueryRevisionsBase::extractRevisionInfo()
+* The following deprecated methods have been removed:
+ * ApiBase::profileIn() (deprecated in 1.25)
+ * ApiBase::profileOut() (deprecated in 1.25)
+ * ApiBase::safeProfileOut() (deprecated in 1.25)
+ * ApiBase::profileDBIn() (deprecated in 1.25)
+ * ApiBase::profileDBOut() (deprecated in 1.25)
+ * ApiBase::dieUsage() (deprecated in 1.29)
+ * ApiBase::dieUsageMsg() (deprecated in 1.29)
+ * ApiBase::dieUsageMsgOrDebug() (deprecated in 1.29)
+ * ApiBase::getErrorFromStatus() (deprecated in 1.29)
+ * ApiBase::parseMsg() (deprecated in 1.29)
+ * ApiBase::setWarning() (deprecated in 1.29)
+ * ApiPageSet::getInvalidTitles() (deprecated in 1.26)
+ * ApiQueryLogEvents::addLogParams() (deprecated in 1.25)
+ * ApiUsageException::getCodeString() (deprecated in 1.29)
+ * ApiUsageException::getMessageArray() (deprecated in 1.29)
+* Class UsageException, deprecated in 1.29, has been removed.
=== Languages updated in 1.32 ===
MediaWiki supports over 350 languages. Many localisations are updated regularly.
* The hook 'UnknownAction', deprecated since 1.19, has now been removed.
* The hook 'ParserLimitReport', deprecated since 1.22, has been removed. Use
the hooks 'ParserLimitReportPrepare' and 'ParserLimitReportFormat' instead.
+* The following deprecated API methods have been removed:
+ * ApiBase::profileIn() (deprecated in 1.25)
+ * ApiBase::profileOut() (deprecated in 1.25)
+ * ApiBase::safeProfileOut() (deprecated in 1.25)
+ * ApiBase::profileDBIn() (deprecated in 1.25)
+ * ApiBase::profileDBOut() (deprecated in 1.25)
+ * ApiBase::dieUsage() (deprecated in 1.29)
+ * ApiBase::dieUsageMsg() (deprecated in 1.29)
+ * ApiBase::dieUsageMsgOrDebug() (deprecated in 1.29)
+ * ApiBase::getErrorFromStatus() (deprecated in 1.29)
+ * ApiBase::parseMsg() (deprecated in 1.29)
+ * ApiBase::setWarning() (deprecated in 1.29)
+ * ApiPageSet::getInvalidTitles() (deprecated in 1.26)
+ * ApiQueryLogEvents::addLogParams() (deprecated in 1.25)
+ * ApiUsageException::getCodeString() (deprecated in 1.29)
+ * ApiUsageException::getMessageArray() (deprecated in 1.29)
+* Class UsageException, deprecated in 1.29, has been removed.
=== Deprecations in 1.32 ===
* HTMLForm::setSubmitProgressive() is deprecated. No need to call it. Submit
'UploadStashWrongOwnerException' => __DIR__ . '/includes/upload/UploadStash.php',
'UploadStashZeroLengthFileException' => __DIR__ . '/includes/upload/UploadStash.php',
'UppercaseCollation' => __DIR__ . '/includes/collation/UppercaseCollation.php',
- 'UsageException' => __DIR__ . '/includes/api/UsageException.php',
'User' => __DIR__ . '/includes/user/User.php',
'UserArray' => __DIR__ . '/includes/user/UserArray.php',
'UserArrayFromResult' => __DIR__ . '/includes/user/UserArrayFromResult.php',
return $status;
}
+ /**
+ * Call wfTransactionalTimeLimit() if this request was POSTed
+ * @since 1.26
+ */
+ protected function useTransactionalTimeLimit() {
+ if ( $this->getRequest()->wasPosted() ) {
+ wfTransactionalTimeLimit();
+ }
+ }
+
/**@}*/
/************************************************************************//**
return false;
}
- /**
- * @deprecated since 1.25
- */
- public function profileIn() {
- wfDeprecated( __METHOD__, '1.25' );
- }
-
- /**
- * @deprecated since 1.25
- */
- public function profileOut() {
- wfDeprecated( __METHOD__, '1.25' );
- }
-
- /**
- * @deprecated since 1.25
- */
- public function safeProfileOut() {
- wfDeprecated( __METHOD__, '1.25' );
- }
-
- /**
- * @deprecated since 1.25
- */
- public function profileDBIn() {
- wfDeprecated( __METHOD__, '1.25' );
- }
-
- /**
- * @deprecated since 1.25
- */
- public function profileDBOut() {
- wfDeprecated( __METHOD__, '1.25' );
- }
-
- /**
- * Call wfTransactionalTimeLimit() if this request was POSTed
- * @since 1.26
- */
- protected function useTransactionalTimeLimit() {
- if ( $this->getRequest()->wasPosted() ) {
- wfTransactionalTimeLimit();
- }
- }
-
- /**
- * @deprecated since 1.29, use ApiBase::addWarning() instead
- * @param string $warning Warning message
- */
- public function setWarning( $warning ) {
- wfDeprecated( __METHOD__, '1.29' );
- $msg = new ApiRawMessage( $warning, 'warning' );
- $this->getErrorFormatter()->addWarning( $this->getModulePath(), $msg );
- }
-
- /**
- * Throw an ApiUsageException, which will (if uncaught) call the main module's
- * error handler and die with an error message.
- *
- * @deprecated since 1.29, use self::dieWithError() instead
- * @param string $description One-line human-readable description of the
- * error condition, e.g., "The API requires a valid action parameter"
- * @param string $errorCode Brief, arbitrary, stable string to allow easy
- * automated identification of the error, e.g., 'unknown_action'
- * @param int $httpRespCode HTTP response code
- * @param array|null $extradata Data to add to the "<error>" element; array in ApiResult format
- * @throws ApiUsageException always
- */
- public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
- wfDeprecated( __METHOD__, '1.29' );
- $this->dieWithError(
- new RawMessage( '$1', [ $description ] ),
- $errorCode,
- $extradata,
- $httpRespCode
- );
- }
-
- /**
- * Get error (as code, string) from a Status object.
- *
- * @since 1.23
- * @deprecated since 1.29, use ApiErrorFormatter::arrayFromStatus instead
- * @param Status $status
- * @param array|null &$extraData Set if extra data from IApiMessage is available (since 1.27)
- * @return array Array of code and error string
- * @throws MWException
- */
- public function getErrorFromStatus( $status, &$extraData = null ) {
- wfDeprecated( __METHOD__, '1.29' );
- if ( $status->isGood() ) {
- throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
- }
-
- $errors = $status->getErrorsByType( 'error' );
- if ( !$errors ) {
- // No errors? Assume the warnings should be treated as errors
- $errors = $status->getErrorsByType( 'warning' );
- }
- if ( !$errors ) {
- // Still no errors? Punt
- $errors = [ [ 'message' => 'unknownerror-nocode', 'params' => [] ] ];
- }
-
- if ( $errors[0]['message'] instanceof MessageSpecifier ) {
- $msg = $errors[0]['message'];
- } else {
- $msg = new Message( $errors[0]['message'], $errors[0]['params'] );
- }
- if ( !$msg instanceof IApiMessage ) {
- $key = $msg->getKey();
- $params = $msg->getParams();
- array_unshift( $params, self::$messageMap[$key] ?? $key );
- $msg = ApiMessage::create( $params );
- }
-
- return [
- $msg->getApiCode(),
- ApiErrorFormatter::stripMarkup( $msg->inLanguage( 'en' )->useDatabase( false )->text() )
- ];
- }
-
- /**
- * @deprecated since 1.29. Prior to 1.29, this was a public mapping from
- * arbitrary strings (often message keys used elsewhere in MediaWiki) to
- * API codes and message texts, and a few interfaces required poking
- * something in here. Now we're repurposing it to map those same strings
- * to i18n messages, and declaring that any interface that requires poking
- * at this is broken and needs replacing ASAP.
- */
- private static $messageMap = [
- 'unknownerror' => 'apierror-unknownerror',
- 'unknownerror-nocode' => 'apierror-unknownerror-nocode',
- 'ns-specialprotected' => 'ns-specialprotected',
- 'protectedinterface' => 'protectedinterface',
- 'namespaceprotected' => 'namespaceprotected',
- 'customcssprotected' => 'customcssprotected',
- 'customjsprotected' => 'customjsprotected',
- 'cascadeprotected' => 'cascadeprotected',
- 'protectedpagetext' => 'protectedpagetext',
- 'protect-cantedit' => 'protect-cantedit',
- 'deleteprotected' => 'deleteprotected',
- 'badaccess-group0' => 'badaccess-group0',
- 'badaccess-groups' => 'badaccess-groups',
- 'titleprotected' => 'titleprotected',
- 'nocreate-loggedin' => 'nocreate-loggedin',
- 'nocreatetext' => 'nocreatetext',
- 'movenologintext' => 'movenologintext',
- 'movenotallowed' => 'movenotallowed',
- 'confirmedittext' => 'confirmedittext',
- 'blockedtext' => 'apierror-blocked',
- 'autoblockedtext' => 'apierror-autoblocked',
- 'systemblockedtext' => 'apierror-systemblocked',
- 'actionthrottledtext' => 'apierror-ratelimited',
- 'alreadyrolled' => 'alreadyrolled',
- 'cantrollback' => 'cantrollback',
- 'readonlytext' => 'readonlytext',
- 'sessionfailure' => 'sessionfailure',
- 'cannotdelete' => 'cannotdelete',
- 'notanarticle' => 'apierror-missingtitle',
- 'selfmove' => 'selfmove',
- 'immobile_namespace' => 'apierror-immobilenamespace',
- 'articleexists' => 'articleexists',
- 'hookaborted' => 'hookaborted',
- 'cantmove-titleprotected' => 'cantmove-titleprotected',
- 'imagenocrossnamespace' => 'imagenocrossnamespace',
- 'imagetypemismatch' => 'imagetypemismatch',
- 'ip_range_invalid' => 'ip_range_invalid',
- 'range_block_disabled' => 'range_block_disabled',
- 'nosuchusershort' => 'nosuchusershort',
- 'badipaddress' => 'badipaddress',
- 'ipb_expiry_invalid' => 'ipb_expiry_invalid',
- 'ipb_already_blocked' => 'ipb_already_blocked',
- 'ipb_blocked_as_range' => 'ipb_blocked_as_range',
- 'ipb_cant_unblock' => 'ipb_cant_unblock',
- 'mailnologin' => 'apierror-cantsend',
- 'ipbblocked' => 'ipbblocked',
- 'ipbnounblockself' => 'ipbnounblockself',
- 'usermaildisabled' => 'usermaildisabled',
- 'blockedemailuser' => 'apierror-blockedfrommail',
- 'notarget' => 'apierror-notarget',
- 'noemail' => 'noemail',
- 'rcpatroldisabled' => 'rcpatroldisabled',
- 'markedaspatrollederror-noautopatrol' => 'markedaspatrollederror-noautopatrol',
- 'delete-toobig' => 'delete-toobig',
- 'movenotallowedfile' => 'movenotallowedfile',
- 'userrights-no-interwiki' => 'userrights-no-interwiki',
- 'userrights-nodatabase' => 'userrights-nodatabase',
- 'nouserspecified' => 'nouserspecified',
- 'noname' => 'noname',
- 'summaryrequired' => 'apierror-summaryrequired',
- 'import-rootpage-invalid' => 'import-rootpage-invalid',
- 'import-rootpage-nosubpage' => 'import-rootpage-nosubpage',
- 'readrequired' => 'apierror-readapidenied',
- 'writedisabled' => 'apierror-noapiwrite',
- 'writerequired' => 'apierror-writeapidenied',
- 'missingparam' => 'apierror-missingparam',
- 'invalidtitle' => 'apierror-invalidtitle',
- 'nosuchpageid' => 'apierror-nosuchpageid',
- 'nosuchrevid' => 'apierror-nosuchrevid',
- 'nosuchuser' => 'nosuchusershort',
- 'invaliduser' => 'apierror-invaliduser',
- 'invalidexpiry' => 'apierror-invalidexpiry',
- 'pastexpiry' => 'apierror-pastexpiry',
- 'create-titleexists' => 'apierror-create-titleexists',
- 'missingtitle-createonly' => 'apierror-missingtitle-createonly',
- 'cantblock' => 'apierror-cantblock',
- 'canthide' => 'apierror-canthide',
- 'cantblock-email' => 'apierror-cantblock-email',
- 'cantunblock' => 'apierror-permissiondenied-generic',
- 'cannotundelete' => 'cannotundelete',
- 'permdenied-undelete' => 'apierror-permissiondenied-generic',
- 'createonly-exists' => 'apierror-articleexists',
- 'nocreate-missing' => 'apierror-missingtitle',
- 'cantchangecontentmodel' => 'apierror-cantchangecontentmodel',
- 'nosuchrcid' => 'apierror-nosuchrcid',
- 'nosuchlogid' => 'apierror-nosuchlogid',
- 'protect-invalidaction' => 'apierror-protect-invalidaction',
- 'protect-invalidlevel' => 'apierror-protect-invalidlevel',
- 'toofewexpiries' => 'apierror-toofewexpiries',
- 'cantimport' => 'apierror-cantimport',
- 'cantimport-upload' => 'apierror-cantimport-upload',
- 'importnofile' => 'importnofile',
- 'importuploaderrorsize' => 'importuploaderrorsize',
- 'importuploaderrorpartial' => 'importuploaderrorpartial',
- 'importuploaderrortemp' => 'importuploaderrortemp',
- 'importcantopen' => 'importcantopen',
- 'import-noarticle' => 'import-noarticle',
- 'importbadinterwiki' => 'importbadinterwiki',
- 'import-unknownerror' => 'apierror-import-unknownerror',
- 'cantoverwrite-sharedfile' => 'apierror-cantoverwrite-sharedfile',
- 'sharedfile-exists' => 'apierror-fileexists-sharedrepo-perm',
- 'mustbeposted' => 'apierror-mustbeposted',
- 'show' => 'apierror-show',
- 'specialpage-cantexecute' => 'apierror-specialpage-cantexecute',
- 'invalidoldimage' => 'apierror-invalidoldimage',
- 'nodeleteablefile' => 'apierror-nodeleteablefile',
- 'fileexists-forbidden' => 'fileexists-forbidden',
- 'fileexists-shared-forbidden' => 'fileexists-shared-forbidden',
- 'filerevert-badversion' => 'filerevert-badversion',
- 'noimageredirect-anon' => 'apierror-noimageredirect-anon',
- 'noimageredirect-logged' => 'apierror-noimageredirect',
- 'spamdetected' => 'apierror-spamdetected',
- 'contenttoobig' => 'apierror-contenttoobig',
- 'noedit-anon' => 'apierror-noedit-anon',
- 'noedit' => 'apierror-noedit',
- 'wasdeleted' => 'apierror-pagedeleted',
- 'blankpage' => 'apierror-emptypage',
- 'editconflict' => 'editconflict',
- 'hashcheckfailed' => 'apierror-badmd5',
- 'missingtext' => 'apierror-notext',
- 'emptynewsection' => 'apierror-emptynewsection',
- 'revwrongpage' => 'apierror-revwrongpage',
- 'undo-failure' => 'undo-failure',
- 'content-not-allowed-here' => 'content-not-allowed-here',
- 'edit-hook-aborted' => 'edit-hook-aborted',
- 'edit-gone-missing' => 'edit-gone-missing',
- 'edit-conflict' => 'edit-conflict',
- 'edit-already-exists' => 'edit-already-exists',
- 'invalid-file-key' => 'apierror-invalid-file-key',
- 'nouploadmodule' => 'apierror-nouploadmodule',
- 'uploaddisabled' => 'uploaddisabled',
- 'copyuploaddisabled' => 'copyuploaddisabled',
- 'copyuploadbaddomain' => 'apierror-copyuploadbaddomain',
- 'copyuploadbadurl' => 'apierror-copyuploadbadurl',
- 'filename-tooshort' => 'filename-tooshort',
- 'filename-toolong' => 'filename-toolong',
- 'illegal-filename' => 'illegal-filename',
- 'filetype-missing' => 'filetype-missing',
- 'mustbeloggedin' => 'apierror-mustbeloggedin',
- ];
-
- /**
- * @deprecated do not use
- * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
- * @return ApiMessage
- */
- private function parseMsgInternal( $error ) {
- $msg = Message::newFromSpecifier( $error );
- if ( !$msg instanceof IApiMessage ) {
- $key = $msg->getKey();
- if ( isset( self::$messageMap[$key] ) ) {
- $params = $msg->getParams();
- array_unshift( $params, self::$messageMap[$key] );
- } else {
- $params = [ 'apierror-unknownerror', wfEscapeWikiText( $key ) ];
- }
- $msg = ApiMessage::create( $params );
- }
- return $msg;
- }
-
- /**
- * Return the error message related to a certain array
- * @deprecated since 1.29
- * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
- * @return array [ 'code' => code, 'info' => info ]
- */
- public function parseMsg( $error ) {
- wfDeprecated( __METHOD__, '1.29' );
- // Check whether someone passed the whole array, instead of one element as
- // documented. This breaks if it's actually an array of fallback keys, but
- // that's long-standing misbehavior introduced in r87627 to incorrectly
- // fix T30797.
- if ( is_array( $error ) ) {
- $first = reset( $error );
- if ( is_array( $first ) ) {
- wfDebug( __METHOD__ . ' was passed an array of arrays. ' . wfGetAllCallers( 5 ) );
- $error = $first;
- }
- }
-
- $msg = $this->parseMsgInternal( $error );
- return [
- 'code' => $msg->getApiCode(),
- 'info' => ApiErrorFormatter::stripMarkup(
- $msg->inLanguage( 'en' )->useDatabase( false )->text()
- ),
- 'data' => $msg->getApiData()
- ];
- }
-
- /**
- * Output the error message related to a certain array
- * @deprecated since 1.29, use ApiBase::dieWithError() instead
- * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
- * @throws ApiUsageException always
- */
- public function dieUsageMsg( $error ) {
- wfDeprecated( __METHOD__, '1.29' );
- $this->dieWithError( $this->parseMsgInternal( $error ) );
- }
-
- /**
- * Will only set a warning instead of failing if the global $wgDebugAPI
- * is set to true. Otherwise behaves exactly as dieUsageMsg().
- * @deprecated since 1.29, use ApiBase::dieWithErrorOrDebug() instead
- * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array
- * @throws ApiUsageException
- * @since 1.21
- */
- public function dieUsageMsgOrDebug( $error ) {
- wfDeprecated( __METHOD__, '1.29' );
- $this->dieWithErrorOrDebug( $this->parseMsgInternal( $error ) );
- }
-
/**
* Return the description message.
*
$msg = Message::newFromSpecifier( $exception );
$params = [];
} else {
- // Extract code and data from the exception, if applicable
- if ( $exception instanceof UsageException ) {
- $data = $exception->getMessageArray();
- if ( !$options['code'] ) {
- $options['code'] = $data['code'];
- }
- unset( $data['code'], $data['info'] );
- $options['data'] = array_merge( $data, $options['data'] );
- }
-
if ( isset( $options['wrap'] ) ) {
$msg = $options['wrap'];
} else {
$feedItems[] = new FeedItem( $errorTitle, $errorText, '', '', '' );
}
} else {
- if ( $e instanceof UsageException ) {
- $errorCode = $e->getCodeString();
- } else {
- // Something is seriously wrong
- $errorCode = 'internal_api_error';
- }
+ // Something is seriously wrong
+ $errorCode = 'internal_api_error';
$errorTitle = $this->msg( 'api-feed-error-title', $errorCode );
$errorText = $e->getMessage();
$feedItems[] = new FeedItem( $errorTitle, $errorText, '', '', '' );
*/
protected function handleException( $e ) {
// T65145: Rollback any open database transactions
- if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) {
- // UsageExceptions are intentional, so don't rollback if that's the case
+ if ( !$e instanceof ApiUsageException ) {
+ // ApiUsageExceptions are intentional, so don't rollback if that's the case
MWExceptionHandler::rollbackMasterChangesAndLog( $e );
}
$this->addWarning( $error );
}
}
- } catch ( UsageException $ex ) {
- // The error printer itself is failing. Try suppressing its request
- // parameters and redo.
- $failed = true;
- $this->addWarning(
- [ 'apiwarn-errorprinterfailed-ex', $ex->getMessage() ], 'errorprinterfailed'
- );
}
if ( $failed ) {
$this->mPrinter = null;
* If an ApiUsageException, errors/warnings will be extracted from the
* embedded StatusValue.
*
- * If a base UsageException, the getMessageArray() method will be used to
- * extract the code and English message for a single error (no warnings).
- *
* Any other exception will be returned with a generic code and wrapper
* text around the exception's (presumably English) message as a single
* error (no warnings).
}
} elseif ( $type !== 'error' ) {
// None of the rest have any messages for non-error types
- } elseif ( $e instanceof UsageException ) {
- // User entered incorrect parameters - generate error response
- $data = Wikimedia\quietCall( [ $e, 'getMessageArray' ] );
- $code = $data['code'];
- $info = $data['info'];
- unset( $data['code'], $data['info'] );
- $messages[] = new ApiRawMessage( [ '$1', $info ], $code, $data );
} else {
// Something is seriously wrong
$config = $this->getConfig();
} else {
$path = null;
}
- if ( $e instanceof ApiUsageException || $e instanceof UsageException ) {
+ if ( $e instanceof ApiUsageException ) {
$link = wfExpandUrl( wfScript( 'api' ) );
$result->addContentValue(
$path,
return $this->mGoodTitles + $this->mMissingTitles;
}
- /**
- * Titles that were deemed invalid by Title::newFromText()
- * The array's index will be unique and negative for each item
- * @deprecated since 1.26, use self::getInvalidTitlesAndReasons()
- * @return string[] Array of strings (not Title objects)
- */
- public function getInvalidTitles() {
- wfDeprecated( __METHOD__, '1.26' );
- return array_map( function ( $t ) {
- return $t['title'];
- }, $this->mInvalidTitles );
- }
-
/**
* Titles that were deemed invalid by Title::newFromText()
* The array's index will be unique and negative for each item
if ( isset( $params['badfilecontexttitle'] ) ) {
$badFileContextTitle = Title::newFromText( $params['badfilecontexttitle'] );
if ( !$badFileContextTitle ) {
- $this->dieUsage( 'Invalid title in badfilecontexttitle parameter', 'invalid-title' );
+ $p = $this->getModulePrefix();
+ $this->dieWithError( [ 'apierror-bad-badfilecontexttitle', $p ], 'invalid-title' );
}
} else {
$badFileContextTitle = false;
$paramList = $h->parseParamString( $otherParams );
if ( !$paramList ) {
- // Just set a warning (instead of dieUsage), as in many cases
+ // Just set a warning (instead of dieWithError), as in many cases
// we could still render the image using width and height parameters,
// and this type of thing could happen between different versions of
// handlers.
$result->addIndexedTagName( [ 'query', $this->getModuleName() ], 'item' );
}
- /**
- * @deprecated since 1.25 Use LogFormatter::formatParametersForApi instead
- * @param ApiResult $result
- * @param array &$vals
- * @param string $params
- * @param string $type
- * @param string $action
- * @param string $ts
- * @param bool $legacy
- * @return array
- */
- public static function addLogParams( $result, &$vals, $params, $type,
- $action, $ts, $legacy = false
- ) {
- wfDeprecated( __METHOD__, '1.25' );
-
- $entry = new ManualLogEntry( $type, $action );
- $entry->setParameters( $params );
- $entry->setTimestamp( $ts );
- $entry->setLegacy( $legacy );
- $formatter = LogFormatter::newFromEntry( $entry );
- $vals['params'] = $formatter->formatParametersForApi();
-
- return $vals;
- }
-
private function extractRowInfo( $row ) {
$logEntry = DatabaseLogEntry::newFromRow( $row );
$vals = [
* If possible, use ApiBase::dieWithError() instead of throwing this directly.
*
* @ingroup API
- * @note This currently extends UsageException for backwards compatibility, so
- * all the existing code that catches UsageException won't break when stuff
- * starts throwing ApiUsageException. Eventually UsageException will go away
- * and this will (probably) extend MWException directly.
*/
-class ApiUsageException extends UsageException implements ILocalizedException {
+class ApiUsageException extends MWException implements ILocalizedException {
protected $modulePath;
protected $status;
// customized by the local wiki.
$enMsg = clone $this->getApiMessage();
$enMsg->inLanguage( 'en' )->useDatabase( false );
- parent::__construct(
- ApiErrorFormatter::stripMarkup( $enMsg->text() ),
- $enMsg->getApiCode(),
- $httpCode,
- $enMsg->getApiData()
- );
+ parent::__construct( ApiErrorFormatter::stripMarkup( $enMsg->text() ), $httpCode );
}
/**
return $this->status;
}
- /**
- * @deprecated Do not use. This only exists here because UsageException is in
- * the inheritance chain for backwards compatibility.
- * @inheritDoc
- */
- public function getCodeString() {
- wfDeprecated( __METHOD__, '1.29' );
- return $this->getApiMessage()->getApiCode();
- }
-
- /**
- * @deprecated Do not use. This only exists here because UsageException is in
- * the inheritance chain for backwards compatibility.
- * @inheritDoc
- */
- public function getMessageArray() {
- wfDeprecated( __METHOD__, '1.29' );
- $enMsg = clone $this->getApiMessage();
- $enMsg->inLanguage( 'en' )->useDatabase( false );
-
- return [
- 'code' => $enMsg->getApiCode(),
- 'info' => ApiErrorFormatter::stripMarkup( $enMsg->text() ),
- ] + $enMsg->getApiData();
- }
-
/**
* @inheritDoc
*/
+++ /dev/null
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * This exception will be thrown when dieUsage is called to stop module execution.
- *
- * @ingroup API
- * @deprecated since 1.29, use ApiUsageException instead
- */
-class UsageException extends MWException {
-
- private $mCodestr;
-
- /**
- * @var null|array
- */
- private $mExtraData;
-
- /**
- * @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 );
- $this->mCodestr = $codestr;
- $this->mExtraData = $extradata;
-
- if ( !$this instanceof ApiUsageException ) {
- wfDeprecated( __METHOD__, '1.29' );
- }
-
- // This should never happen, so throw an exception about it that will
- // hopefully get logged with a backtrace (T138585)
- if ( !is_string( $codestr ) || $codestr === '' ) {
- throw new InvalidArgumentException( 'Invalid $codestr, was ' .
- ( $codestr === '' ? 'empty string' : gettype( $codestr ) )
- );
- }
- }
-
- /**
- * @return string
- */
- public function getCodeString() {
- wfDeprecated( __METHOD__, '1.29' );
- return $this->mCodestr;
- }
-
- /**
- * @return array
- */
- public function getMessageArray() {
- wfDeprecated( __METHOD__, '1.29' );
- $result = [
- 'code' => $this->mCodestr,
- 'info' => $this->getMessage()
- ];
- if ( is_array( $this->mExtraData ) ) {
- $result = array_merge( $result, $this->mExtraData );
- }
-
- return $result;
- }
-
- /**
- * @return string
- */
- public function __toString() {
- return "{$this->getCodeString()}: {$this->getMessage()}";
- }
-}
"apierror-assertnameduserfailed": "Assertion that the user is \"$1\" failed.",
"apierror-assertuserfailed": "Assertion that the user is logged in failed.",
"apierror-autoblocked": "Your IP address has been blocked automatically, because it was used by a blocked user.",
+ "apierror-bad-badfilecontexttitle": "Invalid title in <var>$1badfilecontexttitle</var> parameter.",
"apierror-badconfig-resulttoosmall": "The value of <code>$wgAPIMaxResultSize</code> on this wiki is too small to hold basic result information.",
"apierror-badcontinue": "Invalid continue param. You should pass the original value returned by the previous query.",
"apierror-baddiff": "The diff cannot be retrieved. One or both revisions do not exist or you do not have permission to view them.",
"apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> has been deprecated. Please use <kbd>$2</kbd> instead.",
"apiwarn-difftohidden": "Couldn't diff to r$1: content is hidden.",
"apiwarn-errorprinterfailed": "Error printer failed. Will retry without params.",
- "apiwarn-errorprinterfailed-ex": "Error printer failed (will retry without params): $1",
"apiwarn-ignoring-invalid-templated-value": "Ignoring value <kbd>$2</kbd> in <var>$1</var> when processing templated parameters.",
"apiwarn-invalidcategory": "\"$1\" is not a category.",
"apiwarn-invalidtitle": "\"$1\" is not a valid title.",
"apierror-assertnameduserfailed": "{{doc-apierror}}\n\nParameters:\n* $1 - User name passed in.",
"apierror-assertuserfailed": "{{doc-apierror}}",
"apierror-autoblocked": "{{doc-apierror}}",
+ "apierror-bad-badfilecontexttitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".",
"apierror-badconfig-resulttoosmall": "{{doc-apierror}}",
"apierror-badcontinue": "{{doc-apierror}}",
"apierror-baddiff": "{{doc-apierror}}",
"apiwarn-deprecation-withreplacement": "{{doc-apierror}}\n\nParameters:\n* $1 - Query string fragment that is deprecated, e.g. \"action=tokens\".\n* $2 - Query string fragment to use instead, e.g. \"action=tokens\".",
"apiwarn-difftohidden": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.\n\n\"r\" is short for \"revision\". You may translate it.",
"apiwarn-errorprinterfailed": "{{doc-apierror}}",
- "apiwarn-errorprinterfailed-ex": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception message, which may already end in punctuation. Probably in English.",
"apiwarn-ignoring-invalid-templated-value": "{{doc-apierror}}\n\nParameters:\n* $1 - Target parameter having a bad value.\n* $2 - The bad value being ignored.",
"apiwarn-invalidcategory": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied category name.",
"apiwarn-invalidtitle": "{{doc-apierror}}\n\nParameters:\n* $1 - Supplied title.",
$this->msg( 'apihelp-no-such-module', $moduleName )->inContentLanguage()->parse()
) );
return;
- } catch ( UsageException $ex ) {
- $this->getOutput()->addHTML( Html::rawElement( 'span', [ 'class' => 'error' ],
- $this->msg( 'apihelp-no-such-module', $moduleName )->inContentLanguage()->parse()
- ) );
- return;
}
ApiHelp::getHelp( $this->getContext(), $module, $options );
* @param array $expect
*/
public function testGetMessageFromException( $exception, $options, $expect ) {
- if ( $exception instanceof UsageException ) {
- $this->hideDeprecated( 'UsageException::getMessageArray' );
- }
-
$result = new ApiResult( 8388608 );
$formatter = new ApiErrorFormatter( $result, Language::factory( 'en' ), 'html', false );
* @param array $expect
*/
public function testGetMessageFromException_BC( $exception, $options, $expect ) {
- if ( $exception instanceof UsageException ) {
- $this->hideDeprecated( 'UsageException::getMessageArray' );
- }
-
$result = new ApiResult( 8388608 );
$formatter = new ApiErrorFormatter_BackCompat( $result );
}
public static function provideGetMessageFromException() {
- Wikimedia\suppressWarnings();
- $usageException = new UsageException(
- '<b>Something broke!</b>', 'ue-code', 0, [ 'xxx' => 'yyy', 'baz' => 23 ]
- );
- Wikimedia\restoreWarnings();
-
return [
'Normal exception' => [
new RuntimeException( '<b>Something broke!</b>' ),
'data' => [ 'foo' => 'bar', 'baz' => 42 ],
]
],
- 'UsageException' => [
- $usageException,
- [],
- [
- 'text' => '<b>Something broke!</b>',
- 'code' => 'ue-code',
- 'data' => [ 'xxx' => 'yyy', 'baz' => 23 ],
- ]
- ],
- 'UsageException, wrapped' => [
- $usageException,
- [ 'wrap' => 'parentheses', 'code' => 'some-code', 'data' => [ 'foo' => 'bar', 'baz' => 42 ] ],
- [
- 'text' => '(<b>Something broke!</b>)',
- 'code' => 'some-code',
- 'data' => [ 'xxx' => 'yyy', 'baz' => 42, 'foo' => 'bar' ],
- ]
- ],
'LocalizedException' => [
new LocalizedException( [ 'returnto', '<b>FooBar</b>' ] ),
[],
MWExceptionHandler::getRedactedTraceAsString( $dbex )
)->inLanguage( 'en' )->useDatabase( false )->text();
- Wikimedia\suppressWarnings();
- $usageEx = new UsageException( 'Usage exception!', 'ue', 0, [ 'foo' => 'bar' ] );
- Wikimedia\restoreWarnings();
-
$apiEx1 = new ApiUsageException( null,
StatusValue::newFatal( new ApiRawMessage( 'An error', 'sv-error1' ) ) );
TestingAccessWrapper::newFromObject( $apiEx1 )->modulePath = 'foo+bar';
'servedby' => wfHostname(),
]
],
- [
- $usageEx,
- [ 'existing-error', 'ue' ],
- [
- 'warnings' => [
- [ 'code' => 'existing-warning', 'text' => 'existing warning', 'module' => 'main' ],
- ],
- 'errors' => [
- [ 'code' => 'existing-error', 'text' => 'existing error', 'module' => 'main' ],
- [ 'code' => 'ue', 'text' => "Usage exception!", 'data' => [ 'foo' => 'bar' ] ]
- ],
- 'docref' => "See $doclink for API usage. Subscribe to the mediawiki-api-announce mailing " .
- "list at <https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce> " .
- "for notice of API deprecations and breaking changes.",
- 'servedby' => wfHostname(),
- ]
- ],
[
$apiEx1,
[ 'existing-error', 'sv-error1', 'sv-error2' ],