Software /
code /
prosody
Comparison
plugins/mod_http.lua @ 4892:6c8074f47ca4
mod_http: Add module:http_url([app_name,][default_path]) for a module to get a guess at its external URL
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 18 May 2012 04:24:33 +0100 |
parent | 4774:b2ed4e1bcb6e |
child | 4911:4c8575b09ff6 |
comparison
equal
deleted
inserted
replaced
4891:189cfe565d03 | 4892:6c8074f47ca4 |
---|---|
6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
7 -- | 7 -- |
8 | 8 |
9 module:set_global(); | 9 module:set_global(); |
10 module:depends("http_errors"); | 10 module:depends("http_errors"); |
11 | |
12 local moduleapi = require "core.moduleapi"; | |
13 local url_parse = require "socket.url".parse; | |
11 | 14 |
12 local server = require "net.http.server"; | 15 local server = require "net.http.server"; |
13 | 16 |
14 server.set_default_host(module:get_option_string("http_default_host")); | 17 server.set_default_host(module:get_option_string("http_default_host")); |
15 | 18 |
29 end | 32 end |
30 return method:upper().." "..host..app_path..path; | 33 return method:upper().." "..host..app_path..path; |
31 end | 34 end |
32 | 35 |
33 local function get_base_path(host_module, app_name, default_app_path) | 36 local function get_base_path(host_module, app_name, default_app_path) |
34 return host_module:get_option("http_paths", {})[app_name] -- Host | 37 return normalize_path(host_module:get_option("http_paths", {})[app_name] -- Host |
35 or module:get_option("http_paths", {})[app_name] -- Global | 38 or module:get_option("http_paths", {})[app_name] -- Global |
36 or default_app_path; -- Default | 39 or default_app_path); -- Default |
40 end | |
41 | |
42 -- Helper to deduce a module's external URL | |
43 function moduleapi.http_url(module, app_name, default_path) | |
44 app_name = app_name or (module.name:gsub("^http_", "")); | |
45 local ext = url_parse(module:get_option_string("http_external_url")) or {}; | |
46 local services = portmanager.get_active_services(); | |
47 local http_services = services:get("https") or services:get("http"); | |
48 for interface, ports in pairs(http_services) do | |
49 for port, services in pairs(ports) do | |
50 local path = get_base_path(module, app_name, default_path or "/"..app_name); | |
51 port = tonumber(ext.port) or port or 80; | |
52 if port == 80 then port = ""; else port = ":"..port; end | |
53 return (ext.scheme or services[1].service.name).."://" | |
54 ..(ext.host or module.host)..port | |
55 ..normalize_path(ext.path or "/")..(path:sub(2)); | |
56 end | |
57 end | |
37 end | 58 end |
38 | 59 |
39 function module.add_host(module) | 60 function module.add_host(module) |
40 local host = module.host; | 61 local host = module.host; |
41 local apps = {}; | 62 local apps = {}; |
42 module.environment.apps = apps; | 63 module.environment.apps = apps; |
43 local function http_app_added(event) | 64 local function http_app_added(event) |
44 local app_name = event.item.name; | 65 local app_name = event.item.name; |
45 local default_app_path = event.item.default_path or "/"..app_name; | 66 local default_app_path = event.item.default_path or "/"..app_name; |
46 local app_path = normalize_path(get_base_path(module, app_name, default_app_path)); | 67 local app_path = get_base_path(module, app_name, default_app_path); |
47 if not app_name then | 68 if not app_name then |
48 -- TODO: Link to docs | 69 -- TODO: Link to docs |
49 module:log("error", "HTTP app has no 'name', add one or use module:provides('http', app)"); | 70 module:log("error", "HTTP app has no 'name', add one or use module:provides('http', app)"); |
50 return; | 71 return; |
51 end | 72 end |
52 apps[app_name] = apps[app_name] or {}; | 73 apps[app_name] = apps[app_name] or {}; |