diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/XmlRpcMethod.php | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/XmlRpcMethod.php b/src/XmlRpcMethod.php new file mode 100644 index 0000000..2167e53 --- /dev/null +++ b/src/XmlRpcMethod.php @@ -0,0 +1,75 @@ +<?php + +// SPDX-FileCopyrightText: 2024 Eilertsens Kodeknekkeri +// SPDX-FileCopyrightText: 2024 Harald Eilertsen +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +namespace VolseNet\Webtrap; + +/** + * A representation of an XML-RPC method call. + * + * This is just a representation to hold information about the attempted + * call. It does not try to perform any action on it. + */ +class XmlRpcMethod +{ + /** + * Parse raw XML to an XmlRpcMethod object. + * + * We're not very strict when parsing, but trying to extract the + * most useful information. At the moment that is the method `name`, + * and an array of the `params` passed to the method. + * + * @param string $payload The raw XML representation of the method call. + * + * @return XmlRpcMethod + */ + public static function parse(string $payload): self + { + $parser = xml_parser_create(); + xml_parse_into_struct($parser, $payload, $elements, $index); + xml_parser_free($parser); + + $in_param = false; + $method_name = null; + + foreach ($elements as $e) { + switch ($e['tag']) { + case 'METHODNAME': + $method_name = $e['value']; + break; + + case 'PARAM': + if ($e['type'] === 'open') { + $in_param = true; + } else { + $in_param = false; + } + break; + + case 'VALUE': + if ($in_param) { + $params[] = $e['value']; + } + break; + + default: + // nothing + } + } + + return new XmlRpcMethod($method_name, $params); + } + + /** + * Constructs a new XmlRpcMethod object from the method name and params. + * + * @param string $name The method name + * @param array $params An array or params for the method call. + */ + public function __construct(public string $name, public array $params) + { + } +} |