/** * Load XML and parse into request components * * @param string $request * @return boolean True on success, false if an error occurred. */ public function loadXml($request) { if (!is_string($request)) { $this->_fault = new Polycast_XmlRpc_Fault(635); $this->_fault->setEncoding($this->getEncoding()); return false; } try { $xml = @new SimpleXMLElement($request); } catch (Exception $e) { // Not valid XML $this->_fault = new Polycast_XmlRpc_Fault(631); $this->_fault->setEncoding($this->getEncoding()); return false; } // Check for method name if (empty($xml->methodName)) { // Missing method name $this->_fault = new Polycast_XmlRpc_Fault(632); $this->_fault->setEncoding($this->getEncoding()); return false; } $this->_method = (string) $xml->methodName; // Check for parameters if (!empty($xml->params)) { $types = array(); $argv = array(); foreach ($xml->params->children() as $param) { if (!isset($param->value)) { $this->_fault = new Polycast_XmlRpc_Fault(633); $this->_fault->setEncoding($this->getEncoding()); return false; } try { $param = Polycast_XmlRpc_Value::getXmlRpcValue($param->value, Polycast_XmlRpc_Value::XML_STRING); $types[] = $param->getType(); $argv[] = $param->getValue(); } catch (Exception $e) { $this->_fault = new Polycast_XmlRpc_Fault(636); $this->_fault->setEncoding($this->getEncoding()); return false; } } $this->_types = $types; $this->_params = $argv; } $this->_xml = $request; return true; }
/** * Load a response from an XML response * * Attempts to load a response from an XMLRPC response, autodetecting if it * is a fault response. * * @param string $response * @return boolean True if a valid XMLRPC response, false if a fault * response or invalid input */ public function loadXml($response) { if (!is_string($response)) { $this->_fault = new Polycast_XmlRpc_Fault(650); $this->_fault->setEncoding($this->getEncoding()); return false; } try { $xml = @new SimpleXMLElement($response); } catch (Exception $e) { // Not valid XML $this->_fault = new Polycast_XmlRpc_Fault(651); $this->_fault->setEncoding($this->getEncoding()); return false; } if (!empty($xml->fault)) { // fault response $this->_fault = new Polycast_XmlRpc_Fault(); $this->_fault->setEncoding($this->getEncoding()); $this->_fault->loadXml($response); return false; } if (empty($xml->params)) { // Invalid response $this->_fault = new Polycast_XmlRpc_Fault(652); $this->_fault->setEncoding($this->getEncoding()); return false; } try { if (!isset($xml->params) || !isset($xml->params->param) || !isset($xml->params->param->value)) { throw new Polycast_XmlRpc_Value_Exception('Missing XML-RPC value in XML'); } $valueXml = $xml->params->param->value->asXML(); $valueXml = preg_replace('/<\\?xml version=.*?\\?>/i', '', $valueXml); $value = Polycast_XmlRpc_Value::getXmlRpcValue(trim($valueXml), Polycast_XmlRpc_Value::XML_STRING); } catch (Polycast_XmlRpc_Value_Exception $e) { $this->_fault = new Polycast_XmlRpc_Fault(653); $this->_fault->setEncoding($this->getEncoding()); return false; } $this->setReturnValue($value->getValue()); return true; }
/** * Constructor * * @param Exception $e * @return Polycast_XmlRpc_Server_Fault */ public function __construct(Exception $e) { $this->_exception = $e; $code = 404; $message = 'Unknown error'; $exceptionClass = get_class($e); foreach (array_keys(self::$_faultExceptionClasses) as $class) { if ($e instanceof $class) { $code = $e->getCode(); $message = $e->getMessage(); break; } } parent::__construct($code, $message); // Notify exception observers, if present if (!empty(self::$_observers)) { foreach (array_keys(self::$_observers) as $observer) { call_user_func(array($observer, 'observe'), $this); } } }