From 96940993bd4ec7ffc30b3b29566138b7c143fab1 Mon Sep 17 00:00:00 2001 From: Victor Vasiliev Date: Sun, 18 Nov 2007 09:37:52 +0000 Subject: [PATCH] * (bug 11206) api.php should honor maxlag * Add wfMaxlagError function * Add MIME type override option for format=raw --- RELEASE-NOTES | 1 + includes/GlobalFunctions.php | 20 ++++++++++++++++++++ includes/Wiki.php | 12 ++---------- includes/api/ApiFormatBase.php | 25 ++++++++++++++++++++----- includes/api/ApiMain.php | 19 +++++++++++++++++-- includes/api/ApiRender.php | 2 +- 6 files changed, 61 insertions(+), 18 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 9cb6c86cb5..bdf4a83191 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -194,6 +194,7 @@ Full API documentation is available at http://www.mediawiki.org/wiki/API * (bug 11588) Preserve document structure for empty dataset in backlinks query. * Outputting list of all user preferences rather than having to request them by name * Add raw formatting support. Now several actions like expandtemplates support raw output with format=raw +* (bug 11206) api.php should honor maxlag === Languages updated in 1.12 === diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 008a6d2b4f..fa3eb03502 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -2335,4 +2335,24 @@ function wfGetNull() { return wfIsWindows() ? 'NUL' : '/dev/null'; +} + +/** + * Displays a maxlag error + * + * @param string $host Server that lags the most + * @param int $lag Maxlag (actual) + * @param int $maxLag Maxlag (requested) + */ +function wfMaxlagError( $host, $lag, $maxLag ) { + global $wgShowHostnames; + header( 'HTTP/1.1 503 Service Unavailable' ); + header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) ); + header( 'X-Database-Lag: ' . intval( $lag ) ); + header( 'Content-Type: text/plain' ); + if( $wgShowHostnames ) { + echo "Waiting for $host: $lag seconds lagged\n"; + } else { + echo "Waiting for a database server: $lag seconds lagged\n"; + } } \ No newline at end of file diff --git a/includes/Wiki.php b/includes/Wiki.php index 02f9430543..4920ff2b21 100644 --- a/includes/Wiki.php +++ b/includes/Wiki.php @@ -57,18 +57,10 @@ class MediaWiki { } function checkMaxLag( $maxLag ) { - global $wgLoadBalancer, $wgShowHostnames; + global $wgLoadBalancer; list( $host, $lag ) = $wgLoadBalancer->getMaxLag(); if ( $lag > $maxLag ) { - header( 'HTTP/1.1 503 Service Unavailable' ); - header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) ); - header( 'X-Database-Lag: ' . intval( $lag ) ); - header( 'Content-Type: text/plain' ); - if( $wgShowHostnames ) { - echo "Waiting for $host: $lag seconds lagged\n"; - } else { - echo "Waiting for a database server: $lag seconds lagged\n"; - } + wfMaxlagError( $host, $lag, $maxLag ); return false; } else { return true; diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php index 84205b7169..0693040556 100644 --- a/includes/api/ApiFormatBase.php +++ b/includes/api/ApiFormatBase.php @@ -287,28 +287,43 @@ class ApiFormatRaw extends ApiFormatBase { parent :: __construct($main, $format); } - public static function setRawData( $result, $raw_data ) { + public static function setRawData( $result, $raw_data, $raw_type = 'text/plain' ) { $data = & $result->getData(); $data['_raw'] = $raw_data; + $data['_raw_mimetype'] = $raw_type; } public function getMimeType() { - return 'text/plain'; + $data = $this->getResultData(); + if( !isset( $data['_raw_mimetype'] ) && !isset( $data['error'] ) ) { + ApiBase :: dieDebug( 'ApiFormatRaw', 'No raw data is set for this module' ); + return; + } + elseif( isset( $data['error'] ) ) { + $this->executeError( $data ); + return; + } + return $data['_raw_mimetype']; } public function execute() { $data = $this->getResultData(); if( !isset( $data['_raw'] ) && !isset( $data['error'] ) ) { ApiBase :: dieDebug( 'ApiFormatRaw', 'No raw data is set for this module' ); + return; } elseif( isset( $data['error'] ) ) { - header( '500 Internal error' ); - echo "{$data['error']['code']}\n"; - echo "{$data['error']['info']}\n"; + $this->executeError( $data ); return; } $this->printText( $data['_raw'] ); } + + private function executeError( $data ) { + wfHttpError(500, 'Internal Server Error', ''); + echo "{$data['error']['code']}\n"; + echo "{$data['error']['info']}\n"; + } public function getNeedsRawData() { return true; diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index e5fc508147..f26f52c984 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -186,6 +186,17 @@ class ApiMain extends ApiBase { * have been accumulated, and replace it with an error message and a help screen. */ protected function executeActionWithErrorHandling() { + $params = $this->extractRequestParams(); + if( isset( $params['maxlag'] ) ) { + // Check for maxlag + global $wgLoadBalancer; + $maxLag = $params['maxlag']; + list( $host, $lag ) = $wgLoadBalancer->getMaxLag(); + if ( $lag > $maxLag ) { + wfMaxlagError( $host, $lag, $maxLag ); + return; + } + } // In case an error occurs during data output, // clear the output buffer and print just the error information @@ -358,7 +369,10 @@ class ApiMain extends ApiBase { ApiBase :: PARAM_DFLT => 'help', ApiBase :: PARAM_TYPE => $this->mModuleNames ), - 'version' => false + 'version' => false, + 'maxlag' => array ( + ApiBase :: PARAM_TYPE => 'integer' + ), ); } @@ -369,7 +383,8 @@ class ApiMain extends ApiBase { return array ( 'format' => 'The format of the output', 'action' => 'What action you would like to perform', - 'version' => 'When showing help, include version for each module' + 'version' => 'When showing help, include version for each module', + 'maxlag' => 'Maximum lag' ); } diff --git a/includes/api/ApiRender.php b/includes/api/ApiRender.php index 1a101386f4..3540756018 100644 --- a/includes/api/ApiRender.php +++ b/includes/api/ApiRender.php @@ -57,7 +57,7 @@ class ApiRender extends ApiBase { // Return result $result = $this->getResult(); if( $this->isRaw() ) { - ApiFormatRaw :: setRawData( $result, $retval ); + ApiFormatRaw :: setRawData( $result, $retval, 'text/html' ); } $retval_array = array(); $result->setContent( $retval_array, $retval ); -- 2.20.1