diff options
author | Kim Alvefur <zash@zash.se> | 2023-07-26 14:39:36 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2023-07-26 14:39:36 +0200 |
commit | 7721cc667be083d31cb6371842a717fd7488f434 (patch) | |
tree | 412f910d748d979fcabe52ff660396ec1336354d /plugins/mod_http.lua | |
parent | 3d3beadab6e4494b307930df8495b57f098db6c1 (diff) | |
download | prosody-7721cc667be083d31cb6371842a717fd7488f434.tar.gz prosody-7721cc667be083d31cb6371842a717fd7488f434.zip |
mod_http: Generate URL from configuration in prosodyctl
This removes the need to configure e.g. http_external_url or similar
settings in order to get correct URLs out of prosodyctl, as the API
depends on portmanager to know the actual ports that are used.
Diffstat (limited to 'plugins/mod_http.lua')
-rw-r--r-- | plugins/mod_http.lua | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/plugins/mod_http.lua b/plugins/mod_http.lua index 1534f1b3..c13a2363 100644 --- a/plugins/mod_http.lua +++ b/plugins/mod_http.lua @@ -82,6 +82,7 @@ function moduleapi.http_url(module, app_name, default_path, mode) local external_url = url_parse(module:get_option_string("http_external_url")); if external_url and mode ~= "internal" then + -- Current URL does not depend on knowing which ports are used, only configuration. local url = { scheme = external_url.scheme; host = external_url.host; @@ -93,6 +94,36 @@ function moduleapi.http_url(module, app_name, default_path, mode) return url_build(url); end + if prosody.process_type ~= "prosody" then + -- We generally don't open ports outside of Prosody, so we can't rely on + -- portmanager to tell us which ports and services are used and derive the + -- URL from that, so instead we derive it entirely from configuration. + local https_ports = module:get_option_array("https_ports", { 5281 }); + local scheme = "https"; + local port = tonumber(https_ports[1]); + if not port then + -- https is disabled and no http_external_url set + scheme = "http"; + local http_ports = module:get_option_array("http_ports", { 5280 }); + port = tonumber(http_ports[1]); + if not port then + return "http://disabled.invalid/"; + end + end + + local url = { + scheme = scheme; + host = module:get_option_string("http_host", module.global and module:get_option_string("http_default_host") or module.host); + port = port; + path = get_base_path(module, app_name, default_path or "/" .. app_name); + } + if ports_by_scheme[url.scheme] == url.port then + url.port = nil + end + return url_build(url); + end + + -- Use portmanager to find the actual port of https or http services local services = portmanager.get_active_services(); local http_services = services:get("https") or services:get("http") or {}; for interface, ports in pairs(http_services) do -- luacheck: ignore 213/interface |