Lua XML-RPC: XML-RPC interface to the Lua programming language

Lua XML-RPC
XML-RPC interface to the Lua programming language

## Examples

### Client example

Below is a small sample code displaying the use of the library in a client application.

    	    require "xmlrpc.http"

    	    local ok, res = xmlrpc.http.call (
    	    "http://www.oreillynet.com/meerkat/xml-rpc/server.php",
    	    "system.listMethods")
    	    print (ok)
    	    for i, v in pairs(res) do print ('\t', i, v) end

### Type conversion example

The next example shows how to force the conversion of types from Lua to XML-RPC.

    	    require "xmlrpc"

    	    double_array_type = xmlrpc.newArray ("double")
    	    double_array = xmlrpc.newTypedValue ( { 1.1, 2, 3, 4 }, double_array_type)

    	    double_array_array_type = xmlrpc.newArray (double_array_type)
    	    double_array_array = xmlrpc.newTypedValue (
    	    {
    	    { 11, 12, 13, },
    	    { 21, 22, 23, },
    	    { 31, 32, 33, },
    	    }, double_array_array_type)

The table `double_array_array` will be:

    	    <array>
    	    <data>
    	    <value>
    	    <array>
                <data>
                <value><double>11</double></value>
                <value><double>12</double></value>
                <value><double>13</double></value>
                </data>
    	    </array>
    	    </value>
    	    <value>
    	    <array>
                <data>
                <value><double>21</double></value>
                <value><double>22</double></value>
                <value><double>23</double></value>
                </data>
    	    </array>
    	    </value>
    	    <value>
    	    <array>
                <data>
                <value><double>31</double></value>
                <value><double>32</double></value>
                <value><double>33</double></value>
                </data>
    	    </array>
    	    </value>
    	    </data>
    	    </array>

### Server example

Follows a small example of a server based on Xavante WSAPI. You can call the service for example with the `xmlrpc` tool from XML-RPC C (`xmlrpc http://localhost:12345 hello_world`) or by using `examples/client.lua` in the source tarball.

    require("xavante")
    require("xavante.httpd")
    require("wsapi.xavante")
    require("wsapi.request")
    require("xmlrpc")

    --- XML-RPC WSAPI handler
    -- @param wsapi_env WSAPI environment
    function wsapi_handler(wsapi_env)
       local headers = { ["Content-type"] = "text/xml" }
       local req = wsapi.request.new(wsapi_env)
       local method, arg_table = xmlrpc.srvDecode(req.POST.post_data)
       local func = xmlrpc.dispatch(method)
       local result = { pcall(func, unpack(arg_table or {})) }
       local ok = result[1]
       if not ok then
          result = { code = 3, message = result[2] }
       else
          table.remove(result, 1)
          if table.getn(result) == 1 then
             result = result[1]
          end
       end

       local r = xmlrpc.srvEncode(result, not ok)
       headers["Content-length"] = tostring(#r)

       local function xmlrpc_reply(wsapienv)
          coroutine.yield(r)
       end

       return 200, headers, coroutine.wrap(xmlrpc_reply)
    end

    -- XML-RPC exported functions
    xmlrpc_exports = {}

    --- Get simple string.
    -- @return simple string
    function xmlrpc_exports.hello_world()
       return "Hello World"
    end

    local rules = {{ match = ".", with = wsapi.xavante.makeHandler(wsapi_handler) }}
    local config = { server = {host = "*", port = 12345}, defaultHost = { rules = rules} }

    xmlrpc.srvMethods(xmlrpc_exports)
    xavante.HTTP(config)

    xavante.run()

Note that the package `post` and the function `respond` should be provided by the cgi launcher.