summaryrefslogtreecommitdiff
path: root/api.php
diff options
context:
space:
mode:
Diffstat (limited to 'api.php')
-rw-r--r--api.php43
1 files changed, 35 insertions, 8 deletions
diff --git a/api.php b/api.php
index 8fab878c..2a6a095d 100644
--- a/api.php
+++ b/api.php
@@ -34,13 +34,12 @@
define( 'MW_API', true );
// Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
wfPHPVersionError( 'api.php' );
}
-// Initialise common code.
require __DIR__ . '/includes/WebStart.php';
wfProfileIn( 'api.php' );
@@ -69,8 +68,26 @@ $wgTitle = Title::makeTitle( NS_MAIN, 'API' );
*/
$processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
+// Last chance hook before executing the API
+try {
+ wfRunHooks( 'ApiBeforeMain', array( &$processor ) );
+ if ( !$processor instanceof ApiMain ) {
+ throw new MWException( 'ApiBeforMain hook set $processor to a non-ApiMain class' );
+ }
+} catch ( Exception $e ) {
+ // Crap. Try to report the exception in API format to be friendly to clients.
+ ApiMain::handleApiBeforeMainException( $e );
+ $processor = false;
+}
+
// Process data & print results
-$processor->execute();
+if ( $processor ) {
+ $processor->execute();
+}
+
+if ( function_exists( 'fastcgi_finish_request' ) ) {
+ fastcgi_finish_request();
+}
// Execute any deferred updates
DeferredUpdates::doUpdates();
@@ -78,6 +95,7 @@ DeferredUpdates::doUpdates();
// Log what the user did, for book-keeping purposes.
$endtime = microtime( true );
wfProfileOut( 'api.php' );
+
wfLogProfilingData();
// Log the request
@@ -86,14 +104,23 @@ if ( $wgAPIRequestLog ) {
wfTimestamp( TS_MW ),
$endtime - $starttime,
$wgRequest->getIP(),
- $_SERVER['HTTP_USER_AGENT']
+ $wgRequest->getHeader( 'User-agent' )
);
$items[] = $wgRequest->wasPosted() ? 'POST' : 'GET';
- $module = $processor->getModule();
- if ( $module->mustBePosted() ) {
- $items[] = "action=" . $wgRequest->getVal( 'action' );
+ if ( $processor ) {
+ try {
+ $manager = $processor->getModuleManager();
+ $module = $manager->getModule( $wgRequest->getVal( 'action' ), 'action' );
+ } catch ( Exception $ex ) {
+ $module = null;
+ }
+ if ( !$module || $module->mustBePosted() ) {
+ $items[] = "action=" . $wgRequest->getVal( 'action' );
+ } else {
+ $items[] = wfArrayToCgi( $wgRequest->getValues() );
+ }
} else {
- $items[] = wfArrayToCgi( $wgRequest->getValues() );
+ $items[] = "failed in ApiBeforeMain";
}
wfErrorLog( implode( ',', $items ) . "\n", $wgAPIRequestLog );
wfDebug( "Logged API request to $wgAPIRequestLog\n" );