7 * Handle ajax requests and send them to the proper handler.
10 if ( !( defined( 'MEDIAWIKI' ) && $wgUseAjax ) ) {
14 require_once( 'AjaxFunctions.php' );
17 * Object-Oriented Ajax functions.
20 class AjaxDispatcher {
21 /** The way the request was made, either a 'get' or a 'post' */
24 /** Name of the requested handler */
27 /** Arguments passed */
30 /** Load up our object with user supplied data */
31 function __construct() {
32 wfProfileIn( __METHOD__ );
36 if ( ! empty( $_GET["rs"] ) ) {
40 if ( !empty( $_POST["rs"] ) ) {
44 switch( $this->mode ) {
46 $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
47 if ( ! empty( $_GET["rsargs"] ) ) {
48 $this->args = $_GET["rsargs"];
50 $this->args = array();
54 $this->func_name = isset( $_POST["rs"] ) ? $_POST["rs"] : '';
55 if ( ! empty( $_POST["rsargs"] ) ) {
56 $this->args = $_POST["rsargs"];
58 $this->args = array();
62 wfProfileOut( __METHOD__ );
64 # Or we could throw an exception:
65 # throw new MWException( __METHOD__ . ' called without any data (mode empty).' );
68 wfProfileOut( __METHOD__ );
71 /** Pass the request to our internal function.
72 * BEWARE! Data are passed as they have been supplied by the user,
73 * they should be carefully handled in the function processing the
76 function performAction() {
77 global $wgAjaxExportList, $wgOut, $wgUser;
79 if ( empty( $this->mode ) ) {
83 wfProfileIn( __METHOD__ );
85 if ( ! in_array( $this->func_name, $wgAjaxExportList ) ) {
86 wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name . "\n" );
91 "unknown function " . (string) $this->func_name
93 } elseif ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true )
94 && !$wgUser->isAllowed( 'read' ) )
99 'You must log in to view pages.' );
101 wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" );
103 if ( strpos( $this->func_name, '::' ) !== false ) {
104 $func = explode( '::', $this->func_name, 2 );
106 $func = $this->func_name;
110 $result = call_user_func_array( $func, $this->args );
112 if ( $result === false || $result === null ) {
113 wfDebug( __METHOD__ . ' ERROR while dispatching '
114 . $this->func_name . "(" . var_export( $this->args, true ) . "): "
115 . "no data returned\n" );
117 wfHttpError( 500, 'Internal Error',
118 "{$this->func_name} returned no data" );
120 if ( is_string( $result ) ) {
121 $result = new AjaxResponse( $result );
124 $result->sendHeaders();
125 $result->printText();
127 wfDebug( __METHOD__ . ' dispatch complete for ' . $this->func_name . "\n" );
129 } catch ( Exception $e ) {
130 wfDebug( __METHOD__ . ' ERROR while dispatching '
131 . $this->func_name . "(" . var_export( $this->args, true ) . "): "
132 . get_class( $e ) . ": " . $e->getMessage() . "\n" );
134 if ( !headers_sent() ) {
135 wfHttpError( 500, 'Internal Error',
138 print $e->getMessage();
144 wfProfileOut( __METHOD__ );