comparison mod_rest/mod_rest.lua @ 3811:eb25110696cd

mod_rest: Factor out response content type selection Preparation for future addition of other encodings
author Kim Alvefur <zash@zash.se>
date Wed, 01 Jan 2020 16:01:25 +0100
parents 91ff86fc3b20
children f027b8b1e794
comparison
equal deleted inserted replaced
3810:91ff86fc3b20 3811:eb25110696cd
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