$exception_handling = $this->exception_handling;
}
- // If debug level is 3, we should catch all errors generated during processing of user function, and log them
- // as part of response
- if ($this->debug > 2) {
- self::$_xmlrpcs_prev_ehandler = set_error_handler(array('\PhpXmlRpc\Server', '_xmlrpcs_errorHandler'));
- }
+ // We always catch all errors generated during processing of user function, and log them as part of response;
+ // if debug level is 3 or above, we also serialize them in the response as comments
+ self::$_xmlrpcs_prev_ehandler = set_error_handler(array('\PhpXmlRpc\Server', '_xmlrpcs_errorHandler'));
+
+ /// @todo what about using output-buffering as well, in case user code echoes anything to screen?
try {
// Allow mixed-convention servers
// proper error-response
switch ($exception_handling) {
case 2:
- if ($this->debug > 2) {
- if (self::$_xmlrpcs_prev_ehandler) {
- set_error_handler(self::$_xmlrpcs_prev_ehandler);
- } else {
- restore_error_handler();
- }
+ if (self::$_xmlrpcs_prev_ehandler) {
+ set_error_handler(self::$_xmlrpcs_prev_ehandler);
+ self::$_xmlrpcs_prev_ehandler = null;
+ } else {
+ restore_error_handler();
}
throw $e;
case 1:
// proper error-response
switch ($exception_handling) {
case 2:
- if ($this->debug > 2) {
- if (self::$_xmlrpcs_prev_ehandler) {
- set_error_handler(self::$_xmlrpcs_prev_ehandler);
- } else {
- restore_error_handler();
- }
+ if (self::$_xmlrpcs_prev_ehandler) {
+ set_error_handler(self::$_xmlrpcs_prev_ehandler);
+ self::$_xmlrpcs_prev_ehandler = null;
+ } else {
+ restore_error_handler();
}
throw $e;
case 1:
}
}
- if ($this->debug > 2) {
- // note: restore the error handler we found before calling the user func, even if it has been changed
- // inside the func itself
- if (self::$_xmlrpcs_prev_ehandler) {
- set_error_handler(self::$_xmlrpcs_prev_ehandler);
- } else {
- restore_error_handler();
- }
+ // note: restore the error handler we found before calling the user func, even if it has been changed
+ // inside the func itself
+ if (self::$_xmlrpcs_prev_ehandler) {
+ set_error_handler(self::$_xmlrpcs_prev_ehandler);
+ self::$_xmlrpcs_prev_ehandler = null;
+ } else {
+ restore_error_handler();
}
return $r;
* @internal
* @param $methodName
* @param XMLParser $xmlParser
- * @param resource $parser
+ * @param null|resource $parser
* @return void
* @throws NoSuchMethodException
*
* dirtying a lot the logic, as we would have back to both parseRequest() and execute() methods the info
* about the matched method handler, in order to avoid doing the work twice...
*/
- public function methodNameCallback($methodName, $xmlParser, $parser)
+ public function methodNameCallback($methodName, $xmlParser, $parser = null)
{
$sysCall = $this->isSyscall($methodName);
$dmap = $sysCall ? $this->getSystemDispatchMap() : $this->dmap;