use PhpXmlRpc\Helper\Http;
use PhpXmlRpc\Helper\XMLParser;
+use PhpXmlRpc\Helper\Logger;
class Request
{
public function parseResponse($data = '', $headersProcessed = false, $returnType = 'xmlrpcvals')
{
if ($this->debug) {
- // by maHo, replaced htmlspecialchars with htmlentities
- $this->debugMessage("---GOT---\n$data\n---END---");
+ Logger::instance()->debugMessage("---GOT---\n$data\n---END---");
}
$this->httpResponse = array('raw_data' => $data, 'headers' => array(), 'cookies' => array());
}
}
- if ($this->debug) {
- $start = strpos($data, '<!-- SERVER DEBUG INFO (BASE64 ENCODED):');
- if ($start) {
- $start += strlen('<!-- SERVER DEBUG INFO (BASE64 ENCODED):');
- $end = strpos($data, '-->', $start);
- $comments = substr($data, $start, $end - $start);
- $this->debugMessage("---SERVER DEBUG INFO (DECODED) ---\n\t" . str_replace("\n", "\n\t", base64_decode($comments))) . "\n---END---\n</PRE>";
- }
- }
-
// be tolerant of extra whitespace in response body
$data = trim($data);
$data = substr($data, 0, $pos + 17);
}
+ // try to 'guestimate' the character encoding of the received response
+ $respEncoding = XMLParser::guessEncoding(@$this->httpResponse['headers']['content-type'], $data);
+
+ if ($this->debug) {
+ $start = strpos($data, '<!-- SERVER DEBUG INFO (BASE64 ENCODED):');
+ if ($start) {
+ $start += strlen('<!-- SERVER DEBUG INFO (BASE64 ENCODED):');
+ $end = strpos($data, '-->', $start);
+ $comments = substr($data, $start, $end - $start);
+ Logger::instance()->debugMessage("---SERVER DEBUG INFO (DECODED) ---\n\t" .
+ str_replace("\n", "\n\t", base64_decode($comments)) . "\n---END---", $respEncoding);
+ }
+ }
+
// if user wants back raw xml, give it to him
if ($returnType == 'xml') {
$r = new Response($data, 0, '', 'xml');
return $r;
}
- // try to 'guestimate' the character encoding of the received response
- $respEncoding = Encoder::guess_encoding(@$this->httpResponse['headers']['content-type'], $data);
+ if ($respEncoding != '') {
- // if response charset encoding is not known / supported, try to use
- // the default encoding and parse the xml anyway, but log a warning...
- if (!in_array($respEncoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) {
- // the following code might be better for mb_string enabled installs, but
+ // Since parsing will fail if charset is not specified in the xml prologue,
+ // the encoding is not UTF8 and there are non-ascii chars in the text, we try to work round that...
+ // The following code might be better for mb_string enabled installs, but
// makes the lib about 200% slower...
- //if (!is_valid_charset($respEncoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))
-
- error_log('XML-RPC: ' . __METHOD__ . ': invalid charset encoding of received response: ' . $respEncoding);
- $respEncoding = PhpXmlRpc::$xmlrpc_defencoding;
+ //if (!is_valid_charset($respEncoding, array('UTF-8')))
+ if (!in_array($respEncoding, array('UTF-8', 'US-ASCII')) && !XMLParser::hasEncoding($data)) {
+ if ($respEncoding == 'ISO-8859-1') {
+ $data = utf8_encode($data);
+ } else {
+ if (extension_loaded('mbstring')) {
+ $data = mb_convert_encoding($data, 'UTF-8', $respEncoding);
+ } else {
+ error_log('XML-RPC: ' . __METHOD__ . ': invalid charset encoding of received response: ' . $respEncoding);
+ }
+ }
+ }
}
- $parser = xml_parser_create($respEncoding);
+
+ $parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);
// G. Giunta 2005/02/13: PHP internally uses ISO-8859-1, so we have to tell
// the xml parser to give us back data in the expected charset.
PhpXmlRpc::$xmlrpcstr['invalid_return']);
} else {
if ($this->debug) {
- $this->debugMessage(
- "---PARSED---\n".var_export($xmlRpcParser->_xh['value'], true)."\n---END---", false
+ Logger::instance()->debugMessage(
+ "---PARSED---\n".var_export($xmlRpcParser->_xh['value'], true)."\n---END---"
);
}
$v = &$xmlRpcParser->_xh['value'];
if ($xmlRpcParser->_xh['isf']) {
- /// @todo we should test here if server sent an int and a string,
- /// and/or coerce them into such...
+ /// @todo we should test here if server sent an int and a string, and/or coerce them into such...
if ($returnType == 'xmlrpcvals') {
$errNo_v = $v->structmem('faultCode');
$errStr_v = $v->structmem('faultString');
return $r;
}
-
- /**
- * Echoes a debug message, taking care of escaping it when not in console mode
- *
- * @param string $message
- * @param bool $encodeEntities when false, escapes using htmlspecialchars instead of htmlentities
- */
- protected function debugMessage($message, $encodeEntities = true)
- {
- if (PHP_SAPI != 'cli') {
- if ($encodeEntities)
- print "<PRE>\n".htmlentities($message)."\n</PRE>";
- else
- print "<PRE>\n".htmlspecialchars($message)."\n</PRE>";
- }
- else {
- print "\n$message\n";
- }
- }
}