# HG changeset patch # User Kim Alvefur # Date 1416491326 -3600 # Node ID 0d8cc6971cdb8b2cbee9c3520882e391a8216ffc # Parent 1aa894db35851c244011d0c0a73cef9447cdc31d mod_http_index: Generates an index of local HTTP apps diff -r 1aa894db3585 -r 0d8cc6971cdb mod_http_index/mod_http_index.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_http_index/mod_http_index.lua Thu Nov 20 14:48:46 2014 +0100 @@ -0,0 +1,145 @@ +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 = "/"; +});