mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
mod_http_altconnect: Imported from prosody-modules 6d5a19bdd718 w/changes
Changes from community version: - Add options to allow explicit control over whether BOSH/WS is advertised - Always serve XML at /host-meta (no guessing based on Accept), least surprising
This commit is contained in:
parent
8edde6a299
commit
83e4560a6c
3 changed files with 55 additions and 0 deletions
1
CHANGES
1
CHANGES
|
@ -84,6 +84,7 @@ TRUNK
|
|||
- Support for systemd socket activation in server_epoll
|
||||
- mod_invites_adhoc gained a command for creating password resets
|
||||
- mod_cloud_notify imported from community modules for push notification support
|
||||
- mod_http_altconnect imported from community modules, simplifying web clients
|
||||
|
||||
## Removed
|
||||
|
||||
|
|
|
@ -12,6 +12,8 @@ return {
|
|||
"mod_cloud_notify";
|
||||
-- mod_muc has built-in vcard support
|
||||
"muc_vcard";
|
||||
-- mod_http_altconnect bundled
|
||||
"http_altconnect";
|
||||
-- Roles, module.may and per-session authz
|
||||
"permissions";
|
||||
-- prosody.* namespace
|
||||
|
|
52
plugins/mod_http_altconnect.lua
Normal file
52
plugins/mod_http_altconnect.lua
Normal file
|
@ -0,0 +1,52 @@
|
|||
-- mod_http_altconnect
|
||||
-- XEP-0156: Discovering Alternative XMPP Connection Methods
|
||||
|
||||
module:depends"http";
|
||||
|
||||
local mm = require "prosody.core.modulemanager";
|
||||
local json = require"prosody.util.json";
|
||||
local st = require"prosody.util.stanza";
|
||||
local array = require"prosody.util.array";
|
||||
|
||||
local advertise_bosh = module:get_option_boolean("advertise_bosh", true);
|
||||
local advertise_websocket = module:get_option_boolean("advertise_websocket", true);
|
||||
|
||||
local function get_supported()
|
||||
local uris = array();
|
||||
if advertise_bosh and (mm.is_loaded(module.host, "bosh") or mm.is_loaded("*", "bosh")) then
|
||||
uris:push({ rel = "urn:xmpp:alt-connections:xbosh", href = module:http_url("bosh", "/http-bind") });
|
||||
end
|
||||
if advertise_websocket and (mm.is_loaded(module.host, "websocket") or mm.is_loaded("*", "websocket")) then
|
||||
uris:push({ rel = "urn:xmpp:alt-connections:websocket", href = module:http_url("websocket", "xmpp-websocket"):gsub("^http", "ws") });
|
||||
end
|
||||
return uris;
|
||||
end
|
||||
|
||||
|
||||
local function GET_xml(event)
|
||||
local response = event.response;
|
||||
local xrd = st.stanza("XRD", { xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0' });
|
||||
local uris = get_supported();
|
||||
for _, method in ipairs(uris) do
|
||||
xrd:tag("Link", method):up();
|
||||
end
|
||||
response.headers.content_type = "application/xrd+xml"
|
||||
response.headers.access_control_allow_origin = "*";
|
||||
return '<?xml version="1.0" encoding="UTF-8"?>' .. tostring(xrd);
|
||||
end
|
||||
|
||||
local function GET_json(event)
|
||||
local response = event.response;
|
||||
local jrd = { links = get_supported() };
|
||||
response.headers.content_type = "application/json"
|
||||
response.headers.access_control_allow_origin = "*";
|
||||
return json.encode(jrd);
|
||||
end;
|
||||
|
||||
module:provides("http", {
|
||||
default_path = "/.well-known";
|
||||
route = {
|
||||
["GET /host-meta"] = GET_xml;
|
||||
["GET /host-meta.json"] = GET_json;
|
||||
};
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue