XMLRPC server written as a CGILua 5.0 script.

master
Tomas Guisasola 2005-12-26 18:27:51 +00:00
parent dbe3f4e153
commit bbe8152464
1 changed files with 94 additions and 0 deletions

94
src/server.lua Executable file
View File

@ -0,0 +1,94 @@
require"xmlrpc"
---------------------------------------------------------------------
local function respond (resp)
cgilua.header ("Date", os.date())
cgilua.header ("Server", "Me")
cgilua.header ("Content-length", string.len (resp))
cgilua.header ("Connection", "close")
cgilua.contentheader ("text", "xml")
cgilua.put (resp)
end
---------------------------------------------------------------------
--[[
function assert (cond, msg)
if not cond then
respond (xmlrpc.srvEncode (
{ code = 2, message = msg, },
true
))
os.exit() -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
end
end
--]]
cgilua.seterroroutput (function (msg)
respond (xmlrpc.srvEncode ({ code = 2, message = msg, }, true))
end)
---------------------------------------------------------------------
local function decodedata (doc)
local method, arg_table = xmlrpc.srvDecode (doc)
assert (type(method) == "string", "Invalid `method': string expected")
local t = type(arg_table)
assert (t == "table" or t == "nil", "Invalid table of arguments: not a table nor nil")
local func = xmlrpc.dispatch (method)
assert (type(func) == "function", "Unavailable method")
return func, (arg_table or {})
end
---------------------------------------------------------------------
local function callfunc (func, arg_table)
local result = { pcall (func, unpack (arg_table)) }
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
return ok, result
end
---------------------------------------------------------------------
local kepler_home = "http://www.keplerproject.org"
local kepler_products = { "luasql", "lualdap", "luaexpat", "luaxmlrpc", }
local kepler_sites = {
luasql = kepler_home.."/luasql",
lualdap = kepler_home.."/lualdap",
luaexpat = kepler_home.."/luaexpat",
luaxmlrpc = kepler_home.."/luaxmlrpc",
}
local __methods
__methods = {
system = {
listMethods = function (self)
local l = {}
for name, obj in pairs (__methods) do
for method in pairs (obj) do
table.insert (l, name.."."..method)
end
end
return l
end,
},
kepler = {
products = function (self) return kepler_products end,
site = function (self, prod) return kepler_sites[prod] end,
},
}
---------------------------------------------------------------------
-- Main
---------------------------------------------------------------------
xmlrpc.srvMethods (__methods)
local func, arg_table = decodedata (cgi[1])
local ok, result = callfunc (func, arg_table)
local r = xmlrpc.srvEncode (result, not ok)
respond (r)