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[[
  • {name}
  • ]]; 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 = "/"; });