Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Contact Us
Online Help
Domain Status
Man Pages

Virtual Servers

Topology Map

Server Agreement
Year 2038

USA Flag



Man Pages

Manual Reference Pages  -  CATALYST::PLUGIN::SERVER::XMLRPC (3)

.ds Aq ’


Catalyst::Plugin::Server::XMLRPC -- Catalyst XMLRPC Server Plugin



    package MyApp;
    use Catalyst qw/Server Server::XMLRPC/;

    package MyApp::Controller::Example;
    use base Catalyst::Controller;

    sub echo : XMLRPC {                     # available as: example.echo
        my ( $self, $c, @args ) = @_;
        $c->stash->{xmlrpc} = join , , @args;

    sub ping : XMLRPCPath(/ping) {        # available as: ping
        my ( $self, $c ) = @_;
        $c->stash->{xmlrpc} = Pong;

    sub world : XMLRPCRegex(/hello/) {      # available as: *hello*
        my ($self, $c) = @_;
        $c->stash->{xmlrpc} = World;

    sub echo : XMLRPCLocal {                # available as: example.echo
        my ( $self, $c, @args ) = @_;
        $c->stash->{xmlrpc} = join , , @args;

    sub ping : XMLRPCGlobal {               # available as: ping
        my ( $self, $c ) = @_;
        $c->stash->{xmlrpc} = Pong;


XMLRPC Plugin for Catalyst which we tried to make compatible with the way Catalyst works with URLS. Main features are:
o Split XMLRPC methodNames by STRING to find out Controller.
o Single entrypoint for XMLRPC calls, like http://host.tld/rpc
o DispatchTypes (attributes) which work much the same as Catalyst attrs
o XMLRPC Parameter handling transparent to Catalyst parameter handling


The default behaviour will handle XMLRPC Requests sent to /rpc by creating an OBJECT containing XMLRPC specific parameters in $c->req->xmlrpc.

Directly after, it will find out the Path of the Action to dispatch to, by splitting methodName by .:

  path      : /hello/world

From this point, it will dispatch to ’/hello/world’ when it exists, like Catalyst Urls would do. What means: you will be able to set Regexes, Paths etc on subroutines to define the endpoint.

We discuss these custom XMLRPC attributes below.

When the request is dispatched, we will return $c->stash->{xmlrpc} to the xmlrpc client, or, when it is not available, it will return $c->stash to the client. There is also a way of defining $c->stash keys to be send back to the client.


You can mark any method in your Catalyst application as being available remotely by using one of the following attributes, which can be added to any existing attributes, except Private. Remember that one of the mentioned attributes below are automatically also Privates...
XMLRPC Make this method accessible via XMLRPC, the same way as Local does when using catalyst by URL.

The following example will be accessible by method

  package Catalyst::Controller::Hello
  sub world : XMLRPC {}

XMLRPCLocal Identical version of attribute XMLRPC
XMLRPCGlobal Make this method accessible via XMLRPC, the same way as GLOBAL does when using catalyst by URL.

The following example will be accessible by method ping:

  package Catalyst::Controller::Hello
  sub ping : XMLRPCGlobal {}

XMLRPCPath(’/say/hello’) Make this method accessible via XMLRPC, the same way as Path does when using catalyst by URL.

The following example will be accessible by method say.hello:

  package Catalyst::Controller::Hello
  sub hello : XMLRPCPath(/say/hello) {}

XMLRPCRegex(’foo’) Make this method accessible via XMLRPC, the same way as Regex does when using catalyst by URL.

The following example will be accessible by example methods: wedoofoohere foo.getaround

  package Catalyst::Controller::Hello
  sub hello : XMLRPCPath(foo) {}


Once you’ve used the plugin, you’ll have an $c->request->xmlrpc accessor which will return an Catalyst::Plugin::Server::XMLRPC object.

You can query this object as follows:
$c->req->xmlrpc->is_xmlrpc_request Boolean indicating whether the current request has been initiated via XMLRPC
$c->req->xmlrpc->config Returns a Catalyst::Plugin::Server::XMLRPC::Config object. See the CONFIGURATION below on how to use and configure it.
$c->req->xmlrpc->body The body of the original XMLRPC call
$c->req->xmlrpc->method The name of the original method called via XMLRPC
$c->req->xmlrpc->args A list of parameters supplied by the XMLRPC call
$c->req->xmlrpc->result_as_string The XML body that will be sent back to the XMLRPC client
$c->req->xmlrpc->error Allows you to set xmlrpc fault code and message


  $c->req->xmlrpc->error( [ 401 => Unauthorized ] )

To return status code 401 with message Unauthorized

The default is to return error code 500 on error.

Server Accessors

The following accessors are always available, whether you’re in a xmlrpc specific request or not
$c->server->xmlrpc->list_methods Returns a HASHREF containing the available xmlrpc methods in Catalyst as a key, and the Catalyst::Action object as a value.


To make things transparent, we try to put XMLRPC params into the Request object of Catalyst. But first we will explain something about the XMLRPC specifications.

A full draft of these specifications can be found on:

In short, a xmlrpc-request consists of a methodName, like a subroutine name, and a list of parameters. This list of parameters may contain strings (STRING), arrays (LIST) and structs (HASH). Off course, these can be nested.
$c->req->arguments We will put the list of arguments into $c->req->arguments, thisway you can fetch this list within your dispatched-to-subroutine:

  sub echo : XMLRPC {
      my ($self, $c, @args) = @_;
      $c->log->debug($arg[0]);              # Prints first XMLRPC parameter
                                            # to debug log

$c->req->parameters Because XMLRPC parameters are a LIST, we can’t <B>justB> fill $c->req->paremeters. To keep things transparent, we made an extra config option what tells the XMLRPC server we can assume the following conditions on all XMLRPC requests: - There is only one XMLRPC parameter - This XMLRPC parameter is a struct (HASH)

We will put this STRUCT as key-value pairs into $c->req->parameters.

$c->req->params Alias of $c->req->parameters
$c->req->param Alias of $c->req->parameters


The following system functions are available to the public.,
system.listMethods returns a list of available RPC methods.


The XML-RPC response must contain a single parameter, which may contain an array (LIST), struct (HASH) or a string (STRING). To define the return values in your subroutine, you can alter $c->stash in three different ways.

Defining CW$c->stash->{xmlrpc}

When defining $c->stash->{xmlrpc}, the XMLRPC server will return these values to the client.

When there is no CW$c->stash->{xmlrpc}

When there is no $c->stash->{xmlrpc} set, it will return the complete $c->stash


The XMLRPC Plugin accepts the following configuration options, which can be set in the standard Catalyst way (See perldoc Catalyst for details):

    Your::App->config( xmlrpc => { key => value } );

You can look up any of the config parameters this package uses at runtime by calling:


path This specifies the entry point for your xmlrpc server; all requests are dispatched from there. This is the url any XMLRCP client should post to. You can change this to any Regex wish.

The default is: qr!^(/?)rpc(/|$)!i, which matches on a top-level path begining with rpc preceeded or followed by an optional /, like this:


prefix This specifies the prefix of the forward url.

For example, with a prefix of rpc, and a method foo, the forward path would be come /rpc/foo.

The default is ’’ (empty).

separator This is a STRING used to split your method on, allowing you to use a hierarchy in your method calls.

For example, with a separator of . the method call demo.echo would be forwarded to /demo/echo. To make demo_echo forward to the same path, you would change the separator to _,

The default is ., splitting methods on a single .

convert_params Make the arguments in $c->req->xmlrpc->params available as $c->req->params.

Defaults to true.

show_errors Make system errors in $c->error public to the rpc-caller in a XML-RPC faultString. When show_errors is false, and your catalyst app generates a fault, it will return an XML-RPC fault containing error number 500 and error string: Internal Server Error.

Defaults to false.

xml_encoding Change the xml encoding send over to the client. So you could change the default encoding to UTF-8 for instance.

Defaults to us-ascii which is the default of RPC::XML.

allow_nil Allow undefined values to be encoded as a nil element of an empty string.

Defaults to false which is the default of RPC::XML.


Invalid XMLRPC request: No such method There is no corresponding method in your application that can be forwarded to.
Invalid XMLRPC request %s There was an error parsing the XMLRPC request
Invalid XMLRPC request: Unknown error An unexpected error occurred


Make error messages configurable/filterable Right now, whatever ends up on $c->error gets returned to the client. It would be nice to have a way to filter/massage these messages before they are sent back to the client.
Make stash filterable before returning Just like the error messages, it would be nice to be able to filter the stash before returning so you can filter out keys you don’t want to return to the client, or just return a certain list of keys. This all to make transparent use of XMLRPC and web easier.


Catalyst::Plugin::Server::XMLRPC::Tutorial, Catalyst::Manual, Catalyst::Request, Catalyst::Response, RPC::XML, bin/rpc_client


For the original implementation of this module:

Marcus Ramberg, Christian Hansen Yoshinori Sano


Original Authors: Jos Boumans ( and Michiel Ootjers (

Actually maintained by Jose Luis Martinez Torres JLMARTIN (


Tomas Doran (BOBTFISH) for helping out with the debugging


Please submit all bugs regarding Catalyst::Plugin::Server to


This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself.
Search for    or go to Top of page |  Section 3 |  Main Index

perl v5.20.3 CATALYST::PLUGIN::SERVER::XMLRPC (3) 2016-04-04

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with manServer 1.07.