Software /
code /
prosody-modules
Comparison
mod_rest/mod_rest.lua @ 3803:dc2b5a412286
mod_rest: Log sent and received stanzas in style of mod_c2s etc
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 01 Jan 2020 05:36:09 +0100 |
parent | 3802:f88e07630e4e |
child | 3804:d74509cd35fb |
comparison
equal
deleted
inserted
replaced
3802:f88e07630e4e | 3803:dc2b5a412286 |
---|---|
1 -- RESTful API | 1 -- RESTful API |
2 -- | 2 -- |
3 -- Copyright (c) 2019 Kim Alvefur | 3 -- Copyright (c) 2019-2020 Kim Alvefur |
4 -- | 4 -- |
5 -- This file is MIT/X11 licensed. | 5 -- This file is MIT/X11 licensed. |
6 | 6 |
7 local errors = require "util.error"; | 7 local errors = require "util.error"; |
8 local http = require "net.http"; | 8 local http = require "net.http"; |
60 to = to, | 60 to = to, |
61 id = payload.attr.id or id.medium(), | 61 id = payload.attr.id or id.medium(), |
62 type = payload.attr.type, | 62 type = payload.attr.type, |
63 ["xml:lang"] = payload.attr["xml:lang"], | 63 ["xml:lang"] = payload.attr["xml:lang"], |
64 }; | 64 }; |
65 module:log("debug", "Received[rest]: %s", payload:top_tag()); | |
65 if payload.name == "iq" then | 66 if payload.name == "iq" then |
66 if payload.attr.type ~= "get" and payload.attr.type ~= "set" then | 67 if payload.attr.type ~= "get" and payload.attr.type ~= "set" then |
67 return errors.new({ code = 400, text = "'iq' stanza must be of type 'get' or 'set'" }); | 68 return errors.new({ code = 400, text = "'iq' stanza must be of type 'get' or 'set'" }); |
68 end | 69 end |
69 return module:send_iq(payload):next( | 70 return module:send_iq(payload):next( |
70 function (result) | 71 function (result) |
71 response.headers.content_type = "application/xmpp+xml"; | 72 response.headers.content_type = "application/xmpp+xml"; |
73 module:log("debug", "Sending[rest]: %s", result.stanza:top_tag()); | |
72 return tostring(result.stanza); | 74 return tostring(result.stanza); |
73 end, | 75 end, |
74 function (error) | 76 function (error) |
75 if error.context.stanza then | 77 if error.context.stanza then |
76 response.headers.content_type = "application/xmpp+xml"; | 78 response.headers.content_type = "application/xmpp+xml"; |
79 module:log("debug", "Sending[rest]: %s", error.context.stanza:top_tag()); | |
77 return tostring(error.context.stanza); | 80 return tostring(error.context.stanza); |
78 else | 81 else |
79 return error; | 82 return error; |
80 end | 83 end |
81 end); | 84 end); |
82 elseif payload.name == "message" or payload.name == "presence" then | 85 elseif payload.name == "message" or payload.name == "presence" then |
83 local origin = {}; | 86 local origin = {}; |
84 function origin.send(stanza) | 87 function origin.send(stanza) |
88 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); | |
85 response:send(tostring(stanza)); | 89 response:send(tostring(stanza)); |
86 return true; | 90 return true; |
87 end | 91 end |
88 response.headers.content_type = "application/xmpp+xml"; | 92 response.headers.content_type = "application/xmpp+xml"; |
89 if module:send(payload, origin) then | 93 if module:send(payload, origin) then |
147 local request_body = tostring(stanza); | 151 local request_body = tostring(stanza); |
148 | 152 |
149 -- Keep only the top level element and let the rest be GC'd | 153 -- Keep only the top level element and let the rest be GC'd |
150 stanza = st.clone(stanza, true); | 154 stanza = st.clone(stanza, true); |
151 | 155 |
156 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); | |
152 http.request(rest_url, { | 157 http.request(rest_url, { |
153 body = request_body, | 158 body = request_body, |
154 headers = { | 159 headers = { |
155 ["Content-Type"] = "application/xmpp+xml", | 160 ["Content-Type"] = "application/xmpp+xml", |
156 ["Content-Language"] = stanza.attr["xml:lang"], | 161 ["Content-Language"] = stanza.attr["xml:lang"], |
209 | 214 |
210 if receipt then | 215 if receipt then |
211 reply:add_direct_child(receipt); | 216 reply:add_direct_child(receipt); |
212 end | 217 end |
213 | 218 |
219 module:log("debug", "Received[rest]: %s", reply:top_tag()); | |
220 | |
214 origin.send(reply); | 221 origin.send(reply); |
215 end); | 222 end); |
216 | 223 |
217 return true; | 224 return true; |
218 end | 225 end |