Merge branch 'MDL-32949' of git://github.com/mouneyrac/moodle

This commit is contained in:
Eloy Lafuente (stronk7)
2012-05-15 12:59:18 +02:00
3 changed files with 101 additions and 6 deletions
+3
View File
@@ -140,6 +140,7 @@ class webservice_rest_server extends webservice_base_server {
if ($this->restformat == 'json') {
$errorobject = new stdClass;
$errorobject->exception = get_class($ex);
$errorobject->errorcode = $ex->errorcode;
$errorobject->message = $ex->getMessage();
if (debugging() and isset($ex->debuginfo)) {
$errorobject->debuginfo = $ex->debuginfo;
@@ -148,6 +149,8 @@ class webservice_rest_server extends webservice_base_server {
} else {
$error = '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
$error .= '<EXCEPTION class="'.get_class($ex).'">'."\n";
$error .= '<ERRORCODE>' . htmlspecialchars($ex->errorcode, ENT_COMPAT, 'UTF-8')
. '</ERRORCODE>' . "\n";
$error .= '<MESSAGE>'.htmlspecialchars($ex->getMessage(), ENT_COMPAT, 'UTF-8').'</MESSAGE>'."\n";
if (debugging() and isset($ex->debuginfo)) {
$error .= '<DEBUGINFO>'.htmlspecialchars($ex->debuginfo, ENT_COMPAT, 'UTF-8').'</DEBUGINFO>'."\n";
+85 -5
View File
@@ -41,8 +41,7 @@ class moodle_zend_soap_server extends Zend_Soap_Server {
*
* Note that the arguments are the reverse of those used by SoapFault.
*
* Moodle note: the difference with the Zend server is that we throw a SoapFault exception
* with the debuginfo integrated in the exception message when DEBUG >= NORMAL
* Moodle note: basically we return the faultactor (errorcode) and faultdetails (debuginfo)
*
* If an exception is passed as the first argument, its message and code
* will be used to create the fault object if it has been registered via
@@ -55,15 +54,96 @@ class moodle_zend_soap_server extends Zend_Soap_Server {
*/
public function fault($fault = null, $code = "Receiver")
{
//intercept any exceptions with debug info and transform it in Moodle exception
//run the zend code that clean/create a soapfault
$soapfault = parent::fault($fault, $code);
//intercept any exceptions and add the errorcode and debuginfo (optional)
$actor = null;
$details = null;
if ($fault instanceof Exception) {
//add the debuginfo to the exception message if debuginfo must be returned
$actor = $fault->errorcode;
if (debugging() and isset($fault->debuginfo)) {
$fault = new SoapFault('Receiver', $fault->getMessage() . ' | DEBUG INFO: ' . $fault->debuginfo);
$details = $fault->debuginfo;
}
}
return parent::fault($fault, $code);
return new SoapFault($soapfault->faultcode,
$soapfault->getMessage() . ' | ERRORCODE: ' . $fault->errorcode,
$actor, $details);
}
/**
* NOTE: this is basically a copy of the Zend handle()
* but with $soap->fault returning faultactor + faultdetail
*
* Handle a request
*
* Instantiates SoapServer object with options set in object, and
* dispatches its handle() method.
*
* $request may be any of:
* - DOMDocument; if so, then cast to XML
* - DOMNode; if so, then grab owner document and cast to XML
* - SimpleXMLElement; if so, then cast to XML
* - stdClass; if so, calls __toString() and verifies XML
* - string; if so, verifies XML
*
* If no request is passed, pulls request using php:://input (for
* cross-platform compatability purposes).
*
* @param DOMDocument|DOMNode|SimpleXMLElement|stdClass|string $request Optional request
* @return void|string
*/
public function handle($request = null)
{
if (null === $request) {
$request = file_get_contents('php://input');
}
// Set Zend_Soap_Server error handler
$displayErrorsOriginalState = $this->_initializeSoapErrorContext();
$setRequestException = null;
/**
* @see Zend_Soap_Server_Exception
*/
require_once 'Zend/Soap/Server/Exception.php';
try {
$this->_setRequest($request);
} catch (Zend_Soap_Server_Exception $e) {
$setRequestException = $e;
}
$soap = $this->_getSoap();
ob_start();
if($setRequestException instanceof Exception) {
// Send SOAP fault message if we've catched exception
$soap->fault("Sender", $setRequestException->getMessage());
} else {
try {
$soap->handle($request);
} catch (Exception $e) {
$fault = $this->fault($e);
$faultactor = isset($fault->faultactor) ? $fault->faultactor : null;
$detail = isset($fault->detail) ? $fault->detail : null;
$soap->fault($fault->faultcode, $fault->faultstring, $faultactor, $detail);
}
}
$this->_response = ob_get_clean();
// Restore original error handler
restore_error_handler();
ini_set('display_errors', $displayErrorsOriginalState);
if (!$this->_returnResponse) {
echo $this->_response;
return;
}
return $this->_response;
}
}
+13 -1
View File
@@ -50,9 +50,21 @@ class moodle_zend_xmlrpc_server extends Zend_XmlRpc_Server {
{
//intercept any exceptions with debug info and transform it in Moodle exception
if ($fault instanceof Exception) {
// code php exception must be a long
// we obtain a hash of the errorcode, and then to get an integer hash
$code = base_convert(md5($fault->errorcode), 16, 10);
// code php exception being a long, it has a maximum number of digits.
// we strip the $code to 8 digits, and hope for no error code collisions.
// Collisions should be pretty rare, and if needed the client can retrieve
// the accurate errorcode from the last | in the exception message.
$code = substr($code, 0, 8);
//add the debuginfo to the exception message if debuginfo must be returned
if (debugging() and isset($fault->debuginfo)) {
$fault = new Exception($fault->getMessage() . ' | DEBUG INFO: ' . $fault->debuginfo, 0);
$fault = new Exception($fault->getMessage() . ' | DEBUG INFO: ' . $fault->debuginfo
. ' | ERRORCODE: ' . $fault->errorcode, $code);
} else {
$fault = new Exception($fault->getMessage()
. ' | ERRORCODE: ' . $fault->errorcode, $code);
}
}