# HG changeset patch # User Kim Alvefur # Date 1649459065 -7200 # Node ID c83b009b5bc568602c40a218e6620c519f05a770 # Parent 816b23e09c202f1d697a2f07a8f945a067656d98 mod_rest: Add configuration of which stanzas to route to callback Makes it simpler to build APIs that only handle a certain kind of stanzas, letting them be handled by the unhandled stanza handler instead of having to write code to ignore certain kinds of stanzas. diff -r 816b23e09c20 -r c83b009b5bc5 mod_rest/README.markdown --- a/mod_rest/README.markdown Sat Apr 09 00:43:18 2022 +0200 +++ b/mod_rest/README.markdown Sat Apr 09 01:04:25 2022 +0200 @@ -169,6 +169,41 @@ } ``` +### Which stanzas + +The set of stanzas routed to the callback is determined by these two +settings: + +`rest_callback_stanzas` +: The stanza kinds to handle, defaults to `{ "message", "presence", "iq" }` + +`rest_callback_events` +: For the selected stanza kinds, which events to handle. When loaded +on a Component, this defaults to `{ "bare", "full", "host" }`, while on +a VirtualHost the default is `{ "host" }`. + +Events correspond to which form of address was used in the `to` +attribute of the stanza. + +bare +: `localpart@hostpart` + +full +: `localpart@hostpart/resourcepart` + +host +: `hostpart` + +The following example would handle only stanzas like `` + +```lua +Component "hello.example" "rest" +rest_callback_url = "http://hello.internal.example:9003/api" +rest_callback_stanzas = { "message" } +rest_callback_events = { "bare" } +``` + ### Replying To accept the stanza without returning a reply, respond with HTTP status diff -r 816b23e09c20 -r c83b009b5bc5 mod_rest/mod_rest.lua --- a/mod_rest/mod_rest.lua Sat Apr 09 00:43:18 2022 +0200 +++ b/mod_rest/mod_rest.lua Sat Apr 09 01:04:25 2022 +0200 @@ -553,21 +553,19 @@ return true; end - if module:get_host_type() == "component" then - module:hook("iq/bare", handle_stanza, -1); - module:hook("message/bare", handle_stanza, -1); - module:hook("presence/bare", handle_stanza, -1); - module:hook("iq/full", handle_stanza, -1); - module:hook("message/full", handle_stanza, -1); - module:hook("presence/full", handle_stanza, -1); - module:hook("iq/host", handle_stanza, -1); - module:hook("message/host", handle_stanza, -1); - module:hook("presence/host", handle_stanza, -1); - else - -- Don't override everything on normal VirtualHosts - module:hook("iq/host", handle_stanza, -1); - module:hook("message/host", handle_stanza, -1); - module:hook("presence/host", handle_stanza, -1); + local send_kinds = module:get_option_set("rest_callback_stanzas", { "message", "presence", "iq" }); + + local event_presets = { + -- Don't override everything on normal VirtualHosts by default + ["local"] = { "host" }, + -- Comonents get to handle all kinds of stanzas + ["component"] = { "bare", "full", "host" }, + }; + local hook_events = module:get_option_set("rest_callback_events", event_presets[module:get_host_type()]); + for kind in send_kinds do + for event in hook_events do + module:hook(kind.."/"..event, handle_stanza, -1); + end end end