* (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 ===
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
}
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;
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;
* 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
ApiBase :: PARAM_DFLT => 'help',
ApiBase :: PARAM_TYPE => $this->mModuleNames
),
- 'version' => false
+ 'version' => false,
+ 'maxlag' => array (
+ ApiBase :: PARAM_TYPE => 'integer'
+ ),
);
}
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'
);
}
// 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 );