aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/XmlRpcMethod.php75
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)
+ {
+ }
+}