28 return xml.parse(data); |
28 return xml.parse(data); |
29 elseif mimetype == "text/plain" then |
29 elseif mimetype == "text/plain" then |
30 return st.message({ type = "chat" }, data); |
30 return st.message({ type = "chat" }, data); |
31 end |
31 end |
32 return nil, "unknown-payload-type"; |
32 return nil, "unknown-payload-type"; |
|
33 end |
|
34 |
|
35 local function decide_type() |
|
36 return "application/xmpp+xml"; |
33 end |
37 end |
34 |
38 |
35 local function handle_post(event) |
39 local function handle_post(event) |
36 local request, response = event.request, event.response; |
40 local request, response = event.request, event.response; |
37 if not request.headers.authorization then |
41 if not request.headers.authorization then |
70 id = payload.attr.id or id.medium(), |
74 id = payload.attr.id or id.medium(), |
71 type = payload.attr.type, |
75 type = payload.attr.type, |
72 ["xml:lang"] = payload.attr["xml:lang"], |
76 ["xml:lang"] = payload.attr["xml:lang"], |
73 }; |
77 }; |
74 module:log("debug", "Received[rest]: %s", payload:top_tag()); |
78 module:log("debug", "Received[rest]: %s", payload:top_tag()); |
|
79 local send_type = decide_type(request.headers.accept) |
75 if payload.name == "iq" then |
80 if payload.name == "iq" then |
76 if payload.attr.type ~= "get" and payload.attr.type ~= "set" then |
81 if payload.attr.type ~= "get" and payload.attr.type ~= "set" then |
77 return errors.new({ code = 422, text = "'iq' stanza must be of type 'get' or 'set'" }); |
82 return errors.new({ code = 422, text = "'iq' stanza must be of type 'get' or 'set'" }); |
78 end |
83 end |
79 return module:send_iq(payload):next( |
84 return module:send_iq(payload):next( |
80 function (result) |
85 function (result) |
81 response.headers.content_type = "application/xmpp+xml"; |
|
82 module:log("debug", "Sending[rest]: %s", result.stanza:top_tag()); |
86 module:log("debug", "Sending[rest]: %s", result.stanza:top_tag()); |
|
87 response.headers.content_type = send_type; |
83 return tostring(result.stanza); |
88 return tostring(result.stanza); |
84 end, |
89 end, |
85 function (error) |
90 function (error) |
86 if error.context.stanza then |
91 if error.context.stanza then |
87 response.headers.content_type = "application/xmpp+xml"; |
92 response.headers.content_type = send_type; |
88 module:log("debug", "Sending[rest]: %s", error.context.stanza:top_tag()); |
93 module:log("debug", "Sending[rest]: %s", error.context.stanza:top_tag()); |
89 return tostring(error.context.stanza); |
94 return tostring(error.context.stanza); |
90 else |
95 else |
91 return error; |
96 return error; |
92 end |
97 end |
93 end); |
98 end); |
94 else |
99 else |
95 local origin = {}; |
100 local origin = {}; |
96 function origin.send(stanza) |
101 function origin.send(stanza) |
97 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); |
102 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); |
|
103 response.headers.content_type = send_type; |
98 response:send(tostring(stanza)); |
104 response:send(tostring(stanza)); |
99 return true; |
105 return true; |
100 end |
106 end |
101 response.headers.content_type = "application/xmpp+xml"; |
|
102 if module:send(payload, origin) then |
107 if module:send(payload, origin) then |
103 return 202; |
108 return 202; |
104 else |
109 else |
105 return 500; |
110 return 500; |
106 end |
111 end |
116 }); |
121 }); |
117 |
122 |
118 -- Forward stanzas from XMPP to HTTP and return any reply |
123 -- Forward stanzas from XMPP to HTTP and return any reply |
119 local rest_url = module:get_option_string("rest_callback_url", nil); |
124 local rest_url = module:get_option_string("rest_callback_url", nil); |
120 if rest_url then |
125 if rest_url then |
|
126 local send_type = module:get_option_string("rest_callback_content_type", "application/xmpp+xml"); |
121 |
127 |
122 local code2err = { |
128 local code2err = { |
123 [400] = { condition = "bad-request"; type = "modify" }; |
129 [400] = { condition = "bad-request"; type = "modify" }; |
124 [401] = { condition = "not-authorized"; type = "auth" }; |
130 [401] = { condition = "not-authorized"; type = "auth" }; |
125 [402] = { condition = "not-authorized"; type = "auth" }; |
131 [402] = { condition = "not-authorized"; type = "auth" }; |
162 |
168 |
163 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); |
169 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); |
164 http.request(rest_url, { |
170 http.request(rest_url, { |
165 body = request_body, |
171 body = request_body, |
166 headers = { |
172 headers = { |
167 ["Content-Type"] = "application/xmpp+xml", |
173 ["Content-Type"] = send_type, |
168 ["Content-Language"] = stanza.attr["xml:lang"], |
174 ["Content-Language"] = stanza.attr["xml:lang"], |
169 Accept = "application/xmpp+xml, text/plain", |
175 Accept = "application/xmpp+xml, text/plain", |
170 }, |
176 }, |
171 }, function (body, code, response) |
177 }, function (body, code, response) |
172 if (code == 202 or code == 204) and not reply_needed then |
178 if (code == 202 or code == 204) and not reply_needed then |