Esempio n. 1
0
 /**
  * @param  string $data
  * @return XML_RPC_Response
  */
 private function parseResponse($data = '')
 {
     global $XML_RPC_xh, $XML_RPC_err, $XML_RPC_str;
     $encoding = self::getEncoding($data);
     $parser_resource = xml_parser_create($encoding);
     $parser = (int) $parser_resource;
     $XML_RPC_xh = array();
     $XML_RPC_xh[$parser] = array();
     $XML_RPC_xh[$parser]['cm'] = 0;
     $XML_RPC_xh[$parser]['isf'] = 0;
     $XML_RPC_xh[$parser]['ac'] = '';
     $XML_RPC_xh[$parser]['qt'] = '';
     $XML_RPC_xh[$parser]['stack'] = array();
     $XML_RPC_xh[$parser]['valuestack'] = array();
     xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
     xml_set_element_handler($parser_resource, 'XML_RPC::startElement', 'XML_RPC::endElement');
     xml_set_character_data_handler($parser_resource, 'XML_RPC::cd');
     $hdrfnd = 0;
     if ($this->debug) {
         echo "\n<pre>---GOT---\n";
         echo isset($_SERVER['SERVER_PROTOCOL']) ? htmlspecialchars($data) : $data;
         echo "\n---END---</pre>\n";
     }
     // See if response is a 200 or a 100 then a 200, else raise error.
     // But only do this if we're using the HTTP protocol.
     if (preg_match('@^HTTP@', $data) && !preg_match('@^HTTP/[0-9\\.]+ 200 @', $data) && !preg_match('@^HTTP/[0-9\\.]+ 10[0-9]([A-Z ]+)?[\\r\\n]+HTTP/[0-9\\.]+ 200@', $data)) {
         $errorString = substr($data, 0, strpos($data, "\n") - 1);
         error_log('HTTP error, got response: ' . $errorString);
         $r = new XML_RPC_Response(0, $XML_RPC_err['http_error'], $XML_RPC_str['http_error'] . ' (' . $errorString . ')');
         xml_parser_free($parser_resource);
         return $r;
     }
     // gotta get rid of headers here
     if (!$hdrfnd && ($brpos = strpos($data, "\r\n\r\n"))) {
         $XML_RPC_xh[$parser]['ha'] = substr($data, 0, $brpos);
         $data = substr($data, $brpos + 4);
         $hdrfnd = 1;
     }
     /*
      * be tolerant of junk after methodResponse
      * (e.g. javascript automatically inserted by free hosts)
      * thanks to Luca Mariano <*****@*****.**>
      */
     $data = substr($data, 0, strpos($data, '</methodResponse>') + strlen('</methodResponse>'));
     $this->response_payload = $data;
     if (!xml_parse($parser_resource, $data, sizeof($data))) {
         // thanks to Peter Kocks <*****@*****.**>
         if (xml_get_current_line_number($parser_resource) == 1) {
             $errorString = 'XML error at line 1, check URL';
         } else {
             $errorString = sprintf('XML error: %s at line %d', xml_error_string(xml_get_error_code($parser_resource)), xml_get_current_line_number($parser_resource));
         }
         error_log($errorString);
         $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'], $XML_RPC_str['invalid_return']);
         xml_parser_free($parser_resource);
         return $r;
     }
     xml_parser_free($parser_resource);
     if ($this->debug) {
         echo "\n<pre>---PARSED---\n";
         var_dump($XML_RPC_xh[$parser]['value']);
         echo "---END---</pre>\n";
     }
     if ($XML_RPC_xh[$parser]['isf'] > 1) {
         $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'], $XML_RPC_str['invalid_return'] . ' ' . $XML_RPC_xh[$parser]['isf_reason']);
     } elseif (!is_object($XML_RPC_xh[$parser]['value'])) {
         // then something odd has happened
         // and it's time to generate a client side error
         // indicating something odd went on
         $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'], $XML_RPC_str['invalid_return']);
     } else {
         $v = $XML_RPC_xh[$parser]['value'];
         if ($XML_RPC_xh[$parser]['isf']) {
             $f = $v->structMem('faultCode');
             $fs = $v->structMem('faultString');
             $r = new XML_RPC_Response($v, $f->scalarValue(), $fs->scalarValue());
         } else {
             $r = new XML_RPC_Response($v);
         }
     }
     $r->setHeaders(preg_split("@\r?\n@", $XML_RPC_xh[$parser]['ha']));
     return $r;
 }