diff --git a/includes/xmlrpc.inc b/includes/xmlrpc.inc index dc69dd9..1cbde3c 100644 --- a/includes/xmlrpc.inc +++ b/includes/xmlrpc.inc @@ -166,17 +166,22 @@ function xmlrpc_message($message) { * * @param $xmlrpc_message * An object generated by xmlrpc_message(). + * @param $encoding + * (optional) The encoding that the returned data is in. * * @return * TRUE if parsing succeeded; FALSE otherwise. */ -function xmlrpc_message_parse($xmlrpc_message) { +function xmlrpc_message_parse($xmlrpc_message, $encoding = 'utf-8') { $xmlrpc_message->_parser = xml_parser_create(); // Set XML parser to take the case of tags into account. xml_parser_set_option($xmlrpc_message->_parser, XML_OPTION_CASE_FOLDING, FALSE); // Set XML parser callback functions xml_set_element_handler($xmlrpc_message->_parser, 'xmlrpc_message_tag_open', 'xmlrpc_message_tag_close'); xml_set_character_data_handler($xmlrpc_message->_parser, 'xmlrpc_message_cdata'); + if ($encoding != 'utf-8') { + $xmlrpc_message->message = drupal_convert_to_utf8($xmlrpc_message->message, $encoding); + } xmlrpc_message_set($xmlrpc_message); // Strip XML declaration. @@ -569,6 +574,9 @@ function xmlrpc_base64_get_xml($xmlrpc_base64) { * are specified, a system.multicall is performed. * @param $options * (optional) An array of options to pass along to drupal_http_request(). + * (Additionally optional) + * - encoding + * The encoding that the returned data is in. Only needed if not UTF-8. * * @return * A single response (single request) or an array of responses (multicall @@ -578,6 +586,11 @@ function xmlrpc_base64_get_xml($xmlrpc_base64) { * information. */ function _xmlrpc($url, $args, $options = array()) { + // Get the encoding options and remove it from the array, as it is not used + // by drupal_http_request(). + $encoding = isset($options['encoding']) ? $options['encoding'] : 'UTF-8'; + unset($options['encoding']); + xmlrpc_clear_error(); if (count($args) > 1) { $multicall_args = array(); @@ -603,7 +616,7 @@ function _xmlrpc($url, $args, $options = array()) { } $message = xmlrpc_message($result->data); // Now parse what we've got back - if (!xmlrpc_message_parse($message)) { + if (!xmlrpc_message_parse($message, $encoding)) { // XML error xmlrpc_error(-32700, t('Parse error. Not well formed')); return FALSE;