Software /
code /
prosody-modules
Comparison
mod_rest/mod_rest.lua @ 4954:e8a487c42b36
merge upstream
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 28 May 2022 16:43:04 +0200 |
parent | 4943:e67cc71727ca |
child | 4955:537054999093 |
comparison
equal
deleted
inserted
replaced
4953:7d6ae8bb95dc | 4954:e8a487c42b36 |
---|---|
65 username = id.medium():lower(); | 65 username = id.medium():lower(); |
66 host = module.host; | 66 host = module.host; |
67 } | 67 } |
68 end | 68 end |
69 end | 69 end |
70 | |
71 local function event_suffix(jid_to) | |
72 local node, _, resource = jid.split(jid_to); | |
73 if node then | |
74 if resource then | |
75 return '/full'; | |
76 else | |
77 return '/bare'; | |
78 end | |
79 else | |
80 return '/host'; | |
81 end | |
82 end | |
83 | |
70 | 84 |
71 -- TODO This ought to be handled some way other than duplicating this | 85 -- TODO This ought to be handled some way other than duplicating this |
72 -- core.stanza_router code here. | 86 -- core.stanza_router code here. |
73 local function compat_preevents(origin, stanza) --> boolean : handled | 87 local function compat_preevents(origin, stanza) --> boolean : handled |
74 local to = stanza.attr.to; | 88 local to = stanza.attr.to; |
354 return post_errors.new("iq_type"); | 368 return post_errors.new("iq_type"); |
355 elseif #payload.tags ~= 1 then | 369 elseif #payload.tags ~= 1 then |
356 return post_errors.new("iq_tags"); | 370 return post_errors.new("iq_tags"); |
357 end | 371 end |
358 | 372 |
359 return module:send_iq(payload, origin):next( | 373 -- special handling of multiple responses to MAM queries primarily from |
374 -- remote hosts, local go directly to origin.send() | |
375 local archive_event_name = "message"..event_suffix(from); | |
376 local archive_handler; | |
377 local archive_query = payload:get_child("query", "urn:xmpp:mam:2"); | |
378 if archive_query then | |
379 archive_handler = function(result_event) | |
380 if result_event.stanza:find("{urn:xmpp:mam:2}result/@queryid") == archive_query.attr.queryid then | |
381 origin.send(result_event.stanza); | |
382 return true; | |
383 end | |
384 end | |
385 module:hook(archive_event_name, archive_handler, 1); | |
386 end | |
387 | |
388 local p = module:send_iq(payload, origin):next( | |
360 function (result) | 389 function (result) |
361 module:log("debug", "Sending[rest]: %s", result.stanza:top_tag()); | 390 module:log("debug", "Sending[rest]: %s", result.stanza:top_tag()); |
362 response.headers.content_type = send_type; | 391 response.headers.content_type = send_type; |
392 if responses[1] then | |
393 local tail = responses[#responses]; | |
394 if tail.name ~= "iq" or tail.attr.from ~= result.stanza.attr.from or tail.attr.id ~= result.stanza.attr.id then | |
395 origin.send(result.stanza); | |
396 end | |
397 end | |
363 if responses[2] then | 398 if responses[2] then |
364 return encode(send_type, responses); | 399 return encode(send_type, responses); |
365 end | 400 end |
366 return encode(send_type, result.stanza); | 401 return encode(send_type, result.stanza); |
367 end, | 402 end, |
375 return encode(send_type, error.context.stanza); | 410 return encode(send_type, error.context.stanza); |
376 else | 411 else |
377 return error; | 412 return error; |
378 end | 413 end |
379 end); | 414 end); |
415 | |
416 if archive_handler then | |
417 p:finally(function () | |
418 module:unhook(archive_event_name, archive_handler); | |
419 end) | |
420 end | |
421 | |
422 return p; | |
380 else | 423 else |
381 function origin.send(stanza) | 424 function origin.send(stanza) |
382 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); | 425 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); |
383 response.headers.content_type = send_type; | 426 response.headers.content_type = send_type; |
384 response:send(encode(send_type, stanza)); | 427 response:send(encode(send_type, stanza)); |