aboutsummaryrefslogblamecommitdiffstats
path: root/src/XmlRpcMethod.php
blob: 2167e5358a1cf18dd3e0082342a5caefc948557e (plain) (tree)










































































                                                                              
<?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)
    {
    }
}