local st = require "util.stanza";
local url = require"socket.url";
module:depends"http";
-- local dump = require"util.serialization".new"dump".serialize;
local function template(data)
--[[ DOC
Like util.template, but deals with plain text
Returns a closure that is called with a table of values
{name} is substituted for values["name"] and is XML escaped
{name!} is substituted without XML escaping
{name?} is optional and is replaced with an empty string if no value exists
]]
return function(values)
return (data:gsub("{([^}]-)(%p?)}", function (name, opt)
local value = values[name];
if value then
if opt ~= "!" then
return st.xml_escape(value);
end
return value;
elseif opt == "?" then
return "";
end
end));
end
end
-- TODO Move templates into files
local base = template(template[[
{title}
{title}
{header!}
{body!}
]] { prosody_version = prosody.version, mod_name = module.name });
local canonical = module:http_url(nil, "/");
local page_template = template(base{
canonical = canonical;
title = "HTTP stuff";
header = "";
body = [[
]];
footer = "";
});
local line_template = template[[
]];
local function relative(base, link)
base = url.parse(base);
link = url.parse(link);
for k,v in pairs(base) do
if link[k] == v then
link[k] = nil;
end
end
return url.build(link);
end
local function handler(event)
local items = module:get_host_items("http-provider");
local item;
for i = 1, #items do
item = items[i];
if module.name ~= item._provided_by then
items[i] = line_template{
name = item.name;
module = "mod_" .. item._provided_by;
url = relative(canonical, module:http_url(item.name, item.default_path));
};
else
items[i] = "";
end
end
event.response.headers.content_type = "text/html";
return page_template{
lines = table.concat(items);
};
end
module:provides("http", {
route = {
["GET /"] = handler;
};
default_path = "/";
});