mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel)
Otherwise the global event handlers accumulate, one added each time
logging is reoladed, and each invocation of the signal or event triggers
one dump of each created ringbuffer.
local url = require"socket.url";
local render = require"util.interpolation".new("%b{}", require"util.stanza".xml_escape);
module:depends"http";
local show_all = module:get_option_boolean(module.name .. "_show_all", false);
local base_template;
do
local template_file = module:get_option_string(module.name .. "_template", module.name .. ".html");
template_file = assert(module:load_resource(template_file));
base_template = template_file:read("*a");
template_file:close();
end
local canonical = module:http_url(nil, "/");
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 host_items = module:get_host_items("http-provider");
local http_apps = {}
for _, item in ipairs(host_items) do
if module.name ~= item._provided_by and (show_all or item.title) then
table.insert(http_apps, {
title = item.title or item.name;
name = item.name;
module = "mod_" .. item._provided_by;
url = relative(canonical, module:http_url(item.name, item.default_path));
});
end
end
table.sort(http_apps, function (a, b) return a.name < b.name; end);
event.response.headers.content_type = "text/html";
return render(base_template, {
title = "Prosody IM - HTTP Services";
items = http_apps;
prosody_version = prosody.version;
mod_name = module.name;
canonical = canonical;
});
end
module:provides("http", {
route = {
["GET /"] = handler;
};
default_path = "/";
});