comparison mod_rest/mod_rest.lua @ 5653:62c6e17a5e9d

Merge
author Stephen Paul Weber <singpolyma@singpolyma.net>
date Mon, 18 Sep 2023 08:24:19 -0500
parents 5b316088bef5
children 0cffeff2cd1d
comparison
equal deleted inserted replaced
5652:eade7ff9f52c 5653:62c6e17a5e9d
292 end 292 end
293 end 293 end
294 294
295 local function handle_request(event, path) 295 local function handle_request(event, path)
296 local request, response = event.request, event.response; 296 local request, response = event.request, event.response;
297 local log = request.log or module._log;
297 local from; 298 local from;
298 local origin; 299 local origin;
299 local echo = path == "echo"; 300 local echo = path == "echo";
300 if echo then path = nil; end 301 if echo then path = nil; end
301 302
306 origin = check_credentials(request); 307 origin = check_credentials(request);
307 if not origin then 308 if not origin then
308 return post_errors.new("unauthz"); 309 return post_errors.new("unauthz");
309 end 310 end
310 from = jid.join(origin.username, origin.host, origin.resource); 311 from = jid.join(origin.username, origin.host, origin.resource);
312 origin.full_jid = from;
311 origin.type = "c2s"; 313 origin.type = "c2s";
312 origin.log = module._log; 314 origin.log = log;
313 end 315 end
314 local payload, err = parse_request(request, path); 316 local payload, err = parse_request(request, path);
315 if not payload then 317 if not payload then
316 -- parse fail 318 -- parse fail
317 local ctx = { error = err, type = request.headers.content_type, data = request.body, }; 319 local ctx = { error = err, type = request.headers.content_type, data = request.body, };
350 id = payload.attr.id or id.medium(), 352 id = payload.attr.id or id.medium(),
351 type = payload.attr.type, 353 type = payload.attr.type,
352 ["xml:lang"] = payload.attr["xml:lang"], 354 ["xml:lang"] = payload.attr["xml:lang"],
353 }; 355 };
354 356
355 module:log("debug", "Received[rest]: %s", payload:top_tag()); 357 log("debug", "Received[rest]: %s", payload:top_tag());
356 local send_type = decide_type((request.headers.accept or "") ..",".. (request.headers.content_type or ""), supported_outputs) 358 local send_type = decide_type((request.headers.accept or "") ..",".. (request.headers.content_type or ""), supported_outputs)
357 359
358 if echo then 360 if echo then
359 local ret, err = errors.coerce(encode(send_type, payload)); 361 local ret, err = errors.coerce(encode(send_type, payload));
360 if not ret then return err; end 362 if not ret then return err; end
393 local iq_timeout = tonumber(request.headers.prosody_rest_timeout) or module:get_option_number("rest_iq_timeout", 60*2); 395 local iq_timeout = tonumber(request.headers.prosody_rest_timeout) or module:get_option_number("rest_iq_timeout", 60*2);
394 iq_timeout = math.min(iq_timeout, module:get_option_number("rest_iq_max_timeout", 300)); 396 iq_timeout = math.min(iq_timeout, module:get_option_number("rest_iq_max_timeout", 300));
395 397
396 local p = module:send_iq(payload, origin, iq_timeout):next( 398 local p = module:send_iq(payload, origin, iq_timeout):next(
397 function (result) 399 function (result)
398 module:log("debug", "Sending[rest]: %s", result.stanza:top_tag()); 400 log("debug", "Sending[rest]: %s", result.stanza:top_tag());
399 response.headers.content_type = send_type; 401 response.headers.content_type = send_type;
400 if responses[1] then 402 if responses[1] then
401 local tail = responses[#responses]; 403 local tail = responses[#responses];
402 if tail.name ~= "iq" or tail.attr.from ~= result.stanza.attr.from or tail.attr.id ~= result.stanza.attr.id then 404 if tail.name ~= "iq" or tail.attr.from ~= result.stanza.attr.from or tail.attr.id ~= result.stanza.attr.id then
403 origin.send(result.stanza); 405 origin.send(result.stanza);
408 end 410 end
409 return encode(send_type, result.stanza); 411 return encode(send_type, result.stanza);
410 end, 412 end,
411 function (error) 413 function (error)
412 if not errors.is_err(error) then 414 if not errors.is_err(error) then
413 module:log("error", "Uncaught native error: %s", error); 415 log("error", "Uncaught native error: %s", error);
414 return select(2, errors.coerce(nil, error)); 416 return select(2, errors.coerce(nil, error));
415 elseif error.context and error.context.stanza then 417 elseif error.context and error.context.stanza then
416 response.headers.content_type = send_type; 418 response.headers.content_type = send_type;
417 module:log("debug", "Sending[rest]: %s", error.context.stanza:top_tag()); 419 log("debug", "Sending[rest]: %s", error.context.stanza:top_tag());
418 return encode(send_type, error.context.stanza); 420 return encode(send_type, error.context.stanza);
419 else 421 else
420 return error; 422 return error;
421 end 423 end
422 end); 424 end);
428 end 430 end
429 431
430 return p; 432 return p;
431 else 433 else
432 function origin.send(stanza) 434 function origin.send(stanza)
433 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); 435 log("debug", "Sending[rest]: %s", stanza:top_tag());
434 response.headers.content_type = send_type; 436 response.headers.content_type = send_type;
435 response:send(encode(send_type, stanza)); 437 response:send(encode(send_type, stanza));
436 return true; 438 return true;
437 end 439 end
438 if compat_preevents(origin, payload) then return 202; end 440 if compat_preevents(origin, payload) then return 202; end