/** {@inheritdoc} */ public function serialize($method, array $params = []) { $toBeVisited = [&$params]; while (isset($toBeVisited[0]) && ($value =& $toBeVisited[0])) { $type = gettype($value); if ($type === 'array') { foreach ($value as &$child) { $toBeVisited[] =& $child; } } elseif ($type === 'object') { if ($value instanceof DateTime) { $value = $value->format('Ymd\\TH:i:s'); xmlrpc_set_type($value, 'datetime'); } elseif ($value instanceof Base64Interface) { $value = $value->getDecoded(); xmlrpc_set_type($value, 'base64'); } else { $value = get_object_vars($value); } } elseif ($type === 'resource') { throw SerializationException::invalidType($value); } array_shift($toBeVisited); } return xmlrpc_encode_request($method, $params, ['encoding' => 'UTF-8', 'escaping' => 'markup', 'verbosity' => 'no_white_space']); }
private function convert(array $params) { foreach ($params as $key => $value) { $type = gettype($value); if ($type === 'array') { $params[$key] = $this->convert($value); } elseif ($type === 'object') { if ($value instanceof DateTime) { $params[$key] = (object) ['xmlrpc_type' => 'datetime', 'scalar' => $value->format('Ymd\\TH:i:s'), 'timestamp' => $value->format('u')]; } elseif ($value instanceof Base64Interface) { $params[$key] = (object) ['xmlrpc_type' => 'base64', 'scalar' => $value->getDecoded()]; } else { $params[$key] = get_object_vars($value); } } elseif ($type === 'resource') { throw SerializationException::invalidType($value); } } return $params; }
/** * {@inheritdoc} */ public function serialize($methodName, array $params = []) { $writer = $this->writer; $writer->startDocument('1.0', 'UTF-8'); $writer->startElement('methodCall'); $writer->writeElement('methodName', $methodName); $writer->startElement('params'); $endNode = static function () use($writer) { $writer->endElement(); }; $valueNode = static function () use($writer) { $writer->startElement('value'); }; $paramNode = static function () use($writer) { $writer->startElement('param'); }; $toBeVisited = []; foreach (array_reverse($params) as $param) { $toBeVisited[] = $endNode; $toBeVisited[] = $param; $toBeVisited[] = $paramNode; } $nilTagName = $this->isExtensionEnabled(ExtensionSupportInterface::EXTENSION_NIL) ? 'nil' : 'string'; while ($toBeVisited) { $node = array_pop($toBeVisited); $type = gettype($node); if ($type === 'string') { $writer->startElement('value'); $writer->writeElement('string', $node); $writer->endElement(); } elseif ($type === 'integer') { $writer->startElement('value'); $writer->writeElement('int', $node); $writer->endElement(); } elseif ($type === 'double') { if (!isset($precision)) { $precision = ini_get('precision'); } $writer->startElement('value'); $writer->writeElement('double', $node); $writer->endElement(); } elseif ($type === 'boolean') { $writer->startElement('value'); $writer->writeElement('boolean', $node ? '1' : '0'); $writer->endElement(); } elseif ($type === 'NULL') { $writer->startElement('value'); $writer->writeElement($nilTagName); $writer->endElement(); } elseif ($type === 'array') { /** Find out if it is a struct or an array */ $smallestIndex = 0; foreach ($node as $smallestIndex => &$child) { break; } $isStruct = !is_int($smallestIndex); if (!$isStruct) { $length = count($node) + $smallestIndex; for ($index = $smallestIndex; $index < $length; ++$index) { if (!isset($node[$index])) { $isStruct = true; break; } } } if (!$isStruct) { $toBeVisited[] = $endNode; $toBeVisited[] = $endNode; $toBeVisited[] = $endNode; foreach (array_reverse($node) as $value) { $toBeVisited[] = $value; } $toBeVisited[] = static function () use($writer) { $writer->startElement('array'); $writer->startElement('data'); }; $toBeVisited[] = $valueNode; } else { struct: $toBeVisited[] = $endNode; $toBeVisited[] = $endNode; foreach (array_reverse($node, true) as $key => $value) { $toBeVisited[] = $endNode; $toBeVisited[] = $value; $toBeVisited[] = static function () use($writer, $key) { $writer->writeElement('name', $key); }; $toBeVisited[] = static function () use($writer) { $writer->startElement('member'); }; } $toBeVisited[] = static function () use($writer) { $writer->startElement('struct'); }; $toBeVisited[] = $valueNode; } } elseif ($type === 'object') { if ($node instanceof Closure) { $node(); } elseif ($node instanceof DateTime) { $writer->startElement('value'); $writer->writeElement('dateTime.iso8601', $node->format('Ymd\\TH:i:s')); $writer->endElement(); } elseif ($node instanceof Base64Interface) { $writer->startElement('value'); $writer->writeElement('base64', $node->getEncoded() . "\n"); $writer->endElement(); } else { $node = get_object_vars($node); goto struct; } } elseif ($type === 'resource') { throw SerializationException::invalidType($node); } } $writer->endElement(); $writer->endElement(); $xml = $writer->flush(true); // NativeSerializer does not inject a newline after the declaration if ($xml[38] === "\n") { $xml = substr($xml, 0, 38) . substr($xml, 39); } return $xml; }