diff options
-rw-r--r-- | includes/common.inc | 28 | ||||
-rw-r--r-- | includes/xmlrpc.inc | 5 | ||||
-rw-r--r-- | includes/xmlrpcs.inc | 5 | ||||
-rw-r--r-- | modules/aggregator.module | 9 | ||||
-rw-r--r-- | modules/aggregator/aggregator.module | 9 | ||||
-rw-r--r-- | modules/import.module | 9 |
6 files changed, 34 insertions, 31 deletions
diff --git a/includes/common.inc b/includes/common.inc index 304e753ca..2eae306cb 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -835,6 +835,34 @@ function drupal_page_footer() { module_invoke_all("exit"); } +/** + * Wrapper around xml_parser_create() which extracts the encoding from the XML + * data first and sets the output encoding to UTF-8. This function should be + * used instead of xml_parser_create(), because PHP's XML parser doesn't check + * the input encoding itself. + * + * This is also where unsupported encodings should be converted. + * Callers should take this into account: $data might have been changed after + * the call. + * + * @param $data The XML data which will be parsed later. + */ +function drupal_xml_parser_create(&$data) { + $encoding = 'utf-8'; + if (ereg('^<\?xml[^>]+encoding="([^"]+)"', $data, $match)) { + $encoding = $match[1]; + } + + /* + * Note: unsupported encodings will need to be converted here into UTF-8, + * and $encoding set to 'utf-8'. + */ + + $xml_parser = xml_parser_create($encoding); + xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, 'utf-8'); + return $xml_parser; +} + include_once "includes/theme.inc"; include_once "includes/pager.inc"; include_once "includes/menu.inc"; diff --git a/includes/xmlrpc.inc b/includes/xmlrpc.inc index 0ac5a04a2..9ad7f8ea1 100644 --- a/includes/xmlrpc.inc +++ b/includes/xmlrpc.inc @@ -89,8 +89,6 @@ $xmlrpcstr["no_ssl"]="No SSL support compiled in."; $xmlrpcerr["curl_fail"]=8; $xmlrpcstr["curl_fail"]="CURL error"; -$xmlrpc_defencoding="UTF-8"; - $xmlrpcName="XML-RPC for PHP"; $xmlrpcVersion="1.02"; @@ -622,10 +620,9 @@ class xmlrpcmsg { function parseResponse($data="") { global $_xh,$xmlrpcerr,$xmlrpcstr; - global $xmlrpc_defencoding; - $parser = xml_parser_create($xmlrpc_defencoding); + $parser = drupal_xml_parser_create($data); $_xh[$parser]=array(); diff --git a/includes/xmlrpcs.inc b/includes/xmlrpcs.inc index 01d81822e..c98e5dd51 100644 --- a/includes/xmlrpcs.inc +++ b/includes/xmlrpcs.inc @@ -208,15 +208,14 @@ class xmlrpc_server { function parseRequest($data="") { global $_xh; - global $xmlrpcerr, $xmlrpcstr, $xmlrpcerrxml, $xmlrpc_defencoding, - $_xmlrpcs_dmap; + global $xmlrpcerr, $xmlrpcstr, $xmlrpcerrxml, $_xmlrpcs_dmap; if ($data=="") { $data=$GLOBALS["HTTP_RAW_POST_DATA"]; } - $parser = xml_parser_create($xmlrpc_defencoding); + $parser = drupal_xml_parser_create($data); $_xh[$parser]=array(); $_xh[$parser]['st']=""; diff --git a/modules/aggregator.module b/modules/aggregator.module index aed065eaf..eccd80ad0 100644 --- a/modules/aggregator.module +++ b/modules/aggregator.module @@ -325,17 +325,10 @@ function import_refresh($feed) { return t("failed to parse RSS feed '%site': suspicious input data.", array("%site" => $feed["title"])); } - // extract the XML file's encoding (the XML parser in PHP4 doesn't do this by itself): - $encoding = 'utf-8'; - if (ereg('^<\?xml[^>]+encoding="([^"]+)"', $data, $match)) { - $encoding = $match[1]; - } - // parse the data: - $xml_parser = xml_parser_create($encoding); + $xml_parser = drupal_xml_parser_create($data); xml_set_element_handler($xml_parser, "import_element_start", "import_element_end"); xml_set_character_data_handler($xml_parser, "import_element_data"); - xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, "utf-8"); if (!xml_parse($xml_parser, $data, 1)) { return t("failed to parse RSS feed '%site': %error at line %line.", array("%site" => $feed["title"], "%error" => xml_error_string(xml_get_error_code($xml_parser)), "%line" => xml_get_current_line_number($xml_parser))); diff --git a/modules/aggregator/aggregator.module b/modules/aggregator/aggregator.module index aed065eaf..eccd80ad0 100644 --- a/modules/aggregator/aggregator.module +++ b/modules/aggregator/aggregator.module @@ -325,17 +325,10 @@ function import_refresh($feed) { return t("failed to parse RSS feed '%site': suspicious input data.", array("%site" => $feed["title"])); } - // extract the XML file's encoding (the XML parser in PHP4 doesn't do this by itself): - $encoding = 'utf-8'; - if (ereg('^<\?xml[^>]+encoding="([^"]+)"', $data, $match)) { - $encoding = $match[1]; - } - // parse the data: - $xml_parser = xml_parser_create($encoding); + $xml_parser = drupal_xml_parser_create($data); xml_set_element_handler($xml_parser, "import_element_start", "import_element_end"); xml_set_character_data_handler($xml_parser, "import_element_data"); - xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, "utf-8"); if (!xml_parse($xml_parser, $data, 1)) { return t("failed to parse RSS feed '%site': %error at line %line.", array("%site" => $feed["title"], "%error" => xml_error_string(xml_get_error_code($xml_parser)), "%line" => xml_get_current_line_number($xml_parser))); diff --git a/modules/import.module b/modules/import.module index aed065eaf..eccd80ad0 100644 --- a/modules/import.module +++ b/modules/import.module @@ -325,17 +325,10 @@ function import_refresh($feed) { return t("failed to parse RSS feed '%site': suspicious input data.", array("%site" => $feed["title"])); } - // extract the XML file's encoding (the XML parser in PHP4 doesn't do this by itself): - $encoding = 'utf-8'; - if (ereg('^<\?xml[^>]+encoding="([^"]+)"', $data, $match)) { - $encoding = $match[1]; - } - // parse the data: - $xml_parser = xml_parser_create($encoding); + $xml_parser = drupal_xml_parser_create($data); xml_set_element_handler($xml_parser, "import_element_start", "import_element_end"); xml_set_character_data_handler($xml_parser, "import_element_data"); - xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, "utf-8"); if (!xml_parse($xml_parser, $data, 1)) { return t("failed to parse RSS feed '%site': %error at line %line.", array("%site" => $feed["title"], "%error" => xml_error_string(xml_get_error_code($xml_parser)), "%line" => xml_get_current_line_number($xml_parser))); |