Example #1
0
 /**
  * @param string $xml
  *
  * @return bool
  *
  * @throws ParserException
  */
 public static function isValid($xml)
 {
     $useErrors = libxml_use_internal_errors(true);
     $isCorrect = simplexml_load_string($xml);
     libxml_use_internal_errors($useErrors);
     if (false === $isCorrect) {
         throw ParserException::notXml($xml);
     }
     return true;
 }
Example #2
0
 /**
  * {@inheritdoc}
  */
 public function parse($xmlString)
 {
     if ($this->validateResponse) {
         XmlChecker::isValid($xmlString);
     }
     $result = xmlrpc_decode($xmlString, 'UTF-8');
     if ($result === null && self::isBiggerThanParseLimit($xmlString)) {
         throw ParserException::xmlrpcExtensionLibxmlParsehugeNotSupported();
     }
     $toBeVisited = [&$result];
     while (isset($toBeVisited[0]) && ($value =& $toBeVisited[0])) {
         $type = gettype($value);
         if ($type === 'object') {
             $xmlRpcType = $value->{'xmlrpc_type'};
             if ($xmlRpcType === 'datetime') {
                 $value = \DateTime::createFromFormat('Ymd\\TH:i:s', $value->scalar, isset($timezone) ? $timezone : ($timezone = new \DateTimeZone('UTC')));
             } elseif ($xmlRpcType === 'base64') {
                 if ($value->scalar !== '') {
                     $value = Base64Value::serialize($value->scalar);
                 } else {
                     $value = null;
                 }
             }
         } elseif ($type === 'array') {
             foreach ($value as &$element) {
                 $toBeVisited[] =& $element;
             }
         }
         array_shift($toBeVisited);
     }
     if (is_array($result)) {
         reset($result);
         if (xmlrpc_is_fault($result)) {
             throw FaultException::createFromResponse($result);
         }
     }
     return $result;
 }