- if (!in_array(PhpXmlRpc::$xmlrpc_internalencoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
- {
- xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
- }
- else
- {
- xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, PhpXmlRpc::$xmlrpc_internalencoding);
- }
-
- $xmlRpcParser = new XMLParser();
- xml_set_object($parser, $xmlRpcParser);
-
- if ($this->functions_parameters_type != 'xmlrpcvals')
- xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee_fast');
- else
- xml_set_element_handler($parser, 'xmlrpc_se', 'xmlrpc_ee');
- xml_set_character_data_handler($parser, 'xmlrpc_cd');
- xml_set_default_handler($parser, 'xmlrpc_dh');
- if(!xml_parse($parser, $data, 1))
- {
- // return XML error as a faultCode
- $r=new Response(0,
- PhpXmlRpc::$xmlrpcerrxml+xml_get_error_code($parser),
- sprintf('XML error: %s at line %d, column %d',
- xml_error_string(xml_get_error_code($parser)),
- xml_get_current_line_number($parser), xml_get_current_column_number($parser)));
- xml_parser_free($parser);
- }
- elseif ($xmlRpcParser->_xh['isf'])
- {
- xml_parser_free($parser);
- $r=new Response(0,
+ if (!in_array(PhpXmlRpc::$xmlrpc_internalencoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) {
+ $options = array(XML_OPTION_TARGET_ENCODING => 'UTF-8');
+ } else {
+ $options = array(XML_OPTION_TARGET_ENCODING => PhpXmlRpc::$xmlrpc_internalencoding);
+ }
+
+ $xmlRpcParser = new XMLParser($options);
+ $xmlRpcParser->parse($data, $this->functions_parameters_type, XMLParser::ACCEPT_REQUEST);
+ if ($xmlRpcParser->_xh['isf'] > 2) {
+ // (BC) we return XML error as a faultCode
+ preg_match('/^XML error ([0-9]+)/', $xmlRpcParser->_xh['isf_reason'], $matches);
+ $r = new Response(0,
+ PhpXmlRpc::$xmlrpcerrxml + $matches[1],
+ $xmlRpcParser->_xh['isf_reason']);
+ } elseif ($xmlRpcParser->_xh['isf']) {
+ $r = new Response(0,