mod_rest/mod_rest.lua
changeset 3815 eb25110696cd
parent 3814 91ff86fc3b20
child 3816 f027b8b1e794
equal deleted inserted replaced
3814:91ff86fc3b20 3815: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