]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/AjaxDispatcher.php
MediaWiki 1.14.0
[autoinstallsdev/mediawiki.git] / includes / AjaxDispatcher.php
1 <?php
2 /**
3  * @defgroup Ajax Ajax
4  *
5  * @file
6  * @ingroup Ajax
7  * Handle ajax requests and send them to the proper handler.
8  */
9
10 if( !(defined( 'MEDIAWIKI' ) && $wgUseAjax ) ) {
11         die( 1 );
12 }
13
14 require_once( 'AjaxFunctions.php' );
15
16 /**
17  * Object-Oriented Ajax functions.
18  * @ingroup Ajax
19  */
20 class AjaxDispatcher {
21         /** The way the request was made, either a 'get' or a 'post' */
22         private $mode;
23
24         /** Name of the requested handler */
25         private $func_name;
26
27         /** Arguments passed */
28         private $args;
29
30         /** Load up our object with user supplied data */
31         function __construct() {
32                 wfProfileIn( __METHOD__ );
33
34                 $this->mode = "";
35
36                 if (! empty($_GET["rs"])) {
37                         $this->mode = "get";
38                 }
39
40                 if (!empty($_POST["rs"])) {
41                         $this->mode = "post";
42                 }
43
44                 switch( $this->mode ) {
45
46                 case 'get':
47                         $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
48                         if (! empty($_GET["rsargs"])) {
49                                 $this->args = $_GET["rsargs"];
50                         } else {
51                                 $this->args = array();
52                         }
53                 break;
54
55                 case 'post':
56                         $this->func_name = isset( $_POST["rs"] ) ? $_POST["rs"] : '';
57                         if (! empty($_POST["rsargs"])) {
58                                 $this->args = $_POST["rsargs"];
59                         } else {
60                                 $this->args = array();
61                         }
62                 break;
63
64                 default:
65                         wfProfileOut( __METHOD__ );
66                         return;
67                         # Or we could throw an exception:
68                         #throw new MWException( __METHOD__ . ' called without any data (mode empty).' );
69
70                 }
71
72                 wfProfileOut( __METHOD__ );
73         }
74
75         /** Pass the request to our internal function.
76          * BEWARE! Data are passed as they have been supplied by the user,
77          * they should be carefully handled in the function processing the
78          * request.
79          */
80         function performAction() {
81                 global $wgAjaxExportList, $wgOut;
82
83                 if ( empty( $this->mode ) ) {
84                         return;
85                 }
86                 wfProfileIn( __METHOD__ );
87
88                 if (! in_array( $this->func_name, $wgAjaxExportList ) ) {
89                         wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name . "\n" );
90
91                         wfHttpError( 400, 'Bad Request',
92                                 "unknown function " . (string) $this->func_name );
93                 } else {
94                         wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" );
95
96                         if ( strpos( $this->func_name, '::' ) !== false ) {
97                                 $func = explode( '::', $this->func_name, 2 );
98                         } else {
99                                 $func = $this->func_name;
100                         }
101                         try {
102                                 $result = call_user_func_array($func, $this->args);
103
104                                 if ( $result === false || $result === NULL ) {
105                                         wfDebug( __METHOD__ . ' ERROR while dispatching ' 
106                                                         . $this->func_name . "(" . var_export( $this->args, true ) . "): " 
107                                                         . "no data returned\n" );
108
109                                         wfHttpError( 500, 'Internal Error',
110                                                 "{$this->func_name} returned no data" );
111                                 }
112                                 else {
113                                         if ( is_string( $result ) ) {
114                                                 $result= new AjaxResponse( $result );
115                                         }
116
117                                         $result->sendHeaders();
118                                         $result->printText();
119
120                                         wfDebug( __METHOD__ . ' dispatch complete for ' . $this->func_name . "\n" );
121                                 }
122
123                         } catch (Exception $e) {
124                                 wfDebug( __METHOD__ . ' ERROR while dispatching ' 
125                                                 . $this->func_name . "(" . var_export( $this->args, true ) . "): " 
126                                                 . get_class($e) . ": " . $e->getMessage() . "\n" );
127
128                                 if (!headers_sent()) {
129                                         wfHttpError( 500, 'Internal Error',
130                                                 $e->getMessage() );
131                                 } else {
132                                         print $e->getMessage();
133                                 }
134                         }
135                 }
136
137                 wfProfileOut( __METHOD__ );
138                 $wgOut = null;
139         }
140 }