Introduction
LuaXMLRPC is a Lua library that can be used to build XML-RPC clients and servers. It enables a Lua program to:
- Encode and decode XML-RPC messages without handling XML code
- Transform Lua data structures into XML-RPC data types and vice-versa
LuaXMLRPC provides a simple API and an abstraction layer over XML avoiding manipulation of string representation of data structures.
LuaXMLRPC is based on LuaExpat and on Lua 5.0. The abstraction layer over HTTP depends on LuaSocket 2.0.
Installation
LuaXMLRPC is composed by three Lua files:
xmlrpc.lua
- FALTA COLOCAR OS NOMES DOS OUTROS ARQUIVOS
xmlrpc
created in your
LUA_PATH
.
LuaXMLRPC follows the package model for Lua 5.1, therefore it should be "installed". Refer to Compat-5.1 configuration section about how to install the module.
Data types
XML-RPC elements are usually represented by the simplest correspondent Lua object. When the correspondance is not obvious, a Lua table is used with a field specifying the element.
From XML-RPC to Lua
When converting from XML-RPC element to a Lua data item or table,
a table with a field tag
is used. The child elements are
stored at numbered indexes and white space is ignored.
XML-RPC data type(s) | Lua object |
---|---|
double int i4 |
number |
string | string |
boolean | boolean |
struct arrray |
table |
other elements |
{ tag = "element name", [1] = <first child>, [2] = <second child>, [3] = ..., } |
From Lua to XML-RPC
A conversion from a Lua data item or table to an XML-RPC element can be made automatically or explicitly. The automatic conversion rules are:
Lua object | XML-RPC data type |
---|---|
number | int or double |
string | string |
boolean | boolean |
{ key = val } |
<struct> <member> <name>key</name> <value>val</value> </member> </struct>val is converted according to the same rules. |
Ifn case of a table that has numeric keys, the resulting struct will
have the string representation of these numbers as keys (e.g.
"1"
instead of 1
). The library tries to
convert integral numbers to integer types, otherwise converting
them to floating point numbers.
Library functions
The file xmlrpc.lua
implements the functions that encode and decode XML-RPC messages and transform
data types between the Lua and XML-RPC. The functions are:
clEncode (method_name [, params]) => method_call
- Build a XML-RPC document containing a
methodCall
element. It receives a string with the method's name and an optional list of parameters. The result is a string containing the XML-RPC document. clDecode (method_response) => ok, results
- Disassemble the server response into a Lua object. It receives a
string containing the XML-RPC document representing the
methodResponse
element. The result is a boolean indicating wether the call was successful or not followed by the resulting objects (typically a methodResponse has only one value so only one Lua object will be returned). In case of error thefalse
value is followed by the XMLRPC faultString and the faultCode. This values are extracted from thefault
element. srvDecode (method_call) => method_name, list_params
- Disassemble the client request into a method's name and a table
with the list of parameters. It receives a string containing the
XML-RPC document representing the
methodCall
element. The result is a string with the name of the method to be called and a Lua table with the arguments to the call. srvEncode (object, is_fault) => method_response
- Build a XML-RPC document containing a
methodResponse
element. It receives a Lua object (a number, a string, a table, a "created typed value" etc.) with the return value of the call. The result is a string containing the XML-RPC document. Note that XML-RPC defines that a response only returns one value so a Lua function that returns more than one value has to pack them into a table to guarantee that all of them will be returned. The second parameter (is_fault
) can be used to force afault
element to be generated instead of aparams
. In this case, the Lua object must be a table with the membersfaultCode
andfaultString
. srvMethods (tab_or_func)
- Register the methods on the server. The parameter can be a table or a dispatching function. If a table is given it can have one level of objects with the corresponding methods. If a function is given, it will replace the dispatcher.
dispatch (method_name) => function
- Returns a Lua function that implements the method call. Note that the object is encapsulated into that function so that the call will be turned into a real method call.
Client side
The file xmlrpc.http.lua
implements a simple
stand-alone client based on
LuaSocket 2.0. The
following function is provided:
call (url, method [, params])
- Execute the call to
method
at locationurl
with the givenparams
(if any). Themethod
andparams
parameters will be just passed to clEncode function. The result is the same as clDecode function: a boolean indicating whether the call was successful or not, followed by the response value (if successful) or by the faultString and the faultCode (if the call fails).
Server side
The distribution also offers a simple XML-RPC server implemented over a CGI launcher. This launcher just have to offer a way to decode POST data and to send data back to the client.
The file xmlrpc.cgi.lua
implements a simple XML-RPC
server using the package post
that can parse incoming
POST data from the http server. An appropriate environment for
writing Lua functions is implemented; a new assert
function generates a XML-RPC fault in case of a false condition; a
respond
function creates the correct header for the
responses.
The main goal of this file is to give a starting point for other real implementations.
References
A list of related documentation can be found at: