X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FAjaxDispatcher.php;h=c489cf1cef4777e59014f717f41578e7378f0a07;hb=6145465e34a26d498cdca0a196cc025213127c9f;hp=1f41a83f700e4816222bfc9a7b701aa29c26b96b;hpb=351452fab32b7ce2459e9a945bfd7e777b69b8d3;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/AjaxDispatcher.php b/includes/AjaxDispatcher.php index 1f41a83f70..c489cf1cef 100644 --- a/includes/AjaxDispatcher.php +++ b/includes/AjaxDispatcher.php @@ -1,20 +1,34 @@ mode = ""; @@ -27,65 +41,100 @@ class AjaxDispatcher { $this->mode = "post"; } - if ($this->mode == "get") { + switch( $this->mode ) { + + case 'get': $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : ''; if (! empty($_GET["rsargs"])) { $this->args = $_GET["rsargs"]; } else { $this->args = array(); } - } else { + break; + + case 'post': $this->func_name = isset( $_POST["rs"] ) ? $_POST["rs"] : ''; if (! empty($_POST["rsargs"])) { $this->args = $_POST["rsargs"]; } else { $this->args = array(); } + break; + + default: + wfProfileOut( __METHOD__ ); + return; + # Or we could throw an exception: + #throw new MWException( __METHOD__ . ' called without any data (mode empty).' ); + } + wfProfileOut( __METHOD__ ); } + /** Pass the request to our internal function. + * BEWARE! Data are passed as they have been supplied by the user, + * they should be carefully handled in the function processing the + * request. + */ function performAction() { global $wgAjaxExportList, $wgOut; - + if ( empty( $this->mode ) ) { return; } wfProfileIn( __METHOD__ ); if (! in_array( $this->func_name, $wgAjaxExportList ) ) { - header( 'Status: 400 Bad Request', true, 400 ); - print "unknown function " . htmlspecialchars( (string) $this->func_name ); + wfDebug( __METHOD__ . ' Bad Request for unknown function ' . $this->func_name . "\n" ); + + wfHttpError( 400, 'Bad Request', + "unknown function " . (string) $this->func_name ); } else { + wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" ); + + if ( strpos( $this->func_name, '::' ) !== false ) { + $func = explode( '::', $this->func_name, 2 ); + } else { + $func = $this->func_name; + } try { - $result = call_user_func_array($this->func_name, $this->args); - + $result = call_user_func_array($func, $this->args); + if ( $result === false || $result === NULL ) { - header( 'Status: 500 Internal Error', true, 500 ); - echo "{$this->func_name} returned no data"; + wfDebug( __METHOD__ . ' ERROR while dispatching ' + . $this->func_name . "(" . var_export( $this->args, true ) . "): " + . "no data returned\n" ); + + wfHttpError( 500, 'Internal Error', + "{$this->func_name} returned no data" ); } else { if ( is_string( $result ) ) { $result= new AjaxResponse( $result ); } - + $result->sendHeaders(); $result->printText(); + + wfDebug( __METHOD__ . ' dispatch complete for ' . $this->func_name . "\n" ); } } catch (Exception $e) { + wfDebug( __METHOD__ . ' ERROR while dispatching ' + . $this->func_name . "(" . var_export( $this->args, true ) . "): " + . get_class($e) . ": " . $e->getMessage() . "\n" ); + if (!headers_sent()) { - header( 'Status: 500 Internal Error', true, 500 ); - print $e->getMessage(); + wfHttpError( 500, 'Internal Error', + $e->getMessage() ); } else { print $e->getMessage(); } } } - + wfProfileOut( __METHOD__ ); $wgOut = null; } } - -?>