use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
use Wikimedia\Timestamp\TimestampException;
-use Wikimedia\Rdbms\DBQueryError;
-use Wikimedia\Rdbms\DBError;
/**
* This is the main API class, used for both external and internal processing.
/**
* Constructs an instance of ApiMain that utilizes the module and format specified by $request.
*
- * @param IContextSource|WebRequest $context If this is an instance of
+ * @param IContextSource|WebRequest|null $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
*/
* @return ApiFormatBase
*/
public function createPrinterByName( $format ) {
- $printer = $this->mModuleMgr->getModule( $format, 'format' );
+ $printer = $this->mModuleMgr->getModule( $format, 'format', /* $ignoreCache */ true );
if ( $printer === null ) {
$this->dieWithError(
[ 'apierror-unknownformat', wfEscapeWikiText( $format ) ], 'unknown_format'
$this->executeAction();
$runTime = microtime( true ) - $t;
$this->logRequest( $runTime );
- if ( $this->mModule->isWriteMode() && $this->getRequest()->wasPosted() ) {
- MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
- 'api.' . $this->mModule->getModuleName() . '.executeTiming', 1000 * $runTime
- );
- }
+ MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
+ 'api.' . $this->mModule->getModuleName() . '.executeTiming', 1000 * $runTime
+ );
} catch ( Exception $e ) {
$this->handleException( $e );
$this->logRequest( microtime( true ) - $t, $e );
$config = $this->getConfig();
$class = preg_replace( '#^Wikimedia\\\Rdbms\\\#', '', get_class( $e ) );
$code = 'internal_api_error_' . $class;
- if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
- $params = [ 'apierror-databaseerror', WebRequest::getRequestId() ];
- } else {
+ if ( $config->get( 'ShowExceptionDetails' ) ) {
if ( $e instanceof ILocalizedException ) {
$msg = $e->getMessageObject();
} elseif ( $e instanceof MessageSpecifier ) {
$msg = wfEscapeWikiText( $e->getMessage() );
}
$params = [ 'apierror-exceptioncaught', WebRequest::getRequestId(), $msg ];
+ } else {
+ $params = [ 'apierror-exceptioncaughttype', WebRequest::getRequestId(), get_class( $e ) ];
}
+
$messages[] = ApiMessage::create( $params, $code );
}
return $messages;
)
);
} else {
- if ( $config->get( 'ShowExceptionDetails' ) &&
- ( !$e instanceof DBError || $config->get( 'ShowDBErrorBacktrace' ) )
- ) {
+ if ( $config->get( 'ShowExceptionDetails' ) ) {
$result->addContentValue(
$path,
'trace',
*/
protected function executeAction() {
$params = $this->setupExecuteAction();
+
+ // Check asserts early so e.g. errors in parsing a module's parameters due to being
+ // logged out don't override the client's intended "am I logged in?" check.
+ $this->checkAsserts( $params );
+
$module = $this->setupModule();
$this->mModule = $module;
$this->setupExternalResponse( $module, $params );
}
- $this->checkAsserts( $params );
-
// Execute
$module->execute();
Hooks::run( 'APIAfterExecute', [ &$module ] );
/**
* Log the preceding request
* @param float $time Time in seconds
- * @param Exception $e Exception caught while processing the request
+ * @param Exception|null $e Exception caught while processing the request
*/
protected function logRequest( $time, $e = null ) {
$request = $this->getRequest();