aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2023-07-26 14:39:36 +0200
committerKim Alvefur <zash@zash.se>2023-07-26 14:39:36 +0200
commit7721cc667be083d31cb6371842a717fd7488f434 (patch)
tree412f910d748d979fcabe52ff660396ec1336354d
parent3d3beadab6e4494b307930df8495b57f098db6c1 (diff)
downloadprosody-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.
-rw-r--r--plugins/mod_http.lua31
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