comparison mod_rest/mod_rest.lua @ 5585:5b316088bef5

mod_rest: Use logger of HTTP request in trunk In Prosody trunk rev c975dafa4303 each HTTP request gained its own log sink, to make it easy to log things related to each request and group those messages. Especially where async is used, spreading the request and response apart as mod_rest does with iq stanzas, this grouped logging should help find related messages.
author Kim Alvefur <zash@zash.se>
date Fri, 07 Jul 2023 00:10:37 +0200
parents d7667d9ad96a
children 0cffeff2cd1d
comparison
equal deleted inserted replaced
5584:2ac5f459e097 5585:5b316088bef5
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
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);
311 origin.full_jid = from; 312 origin.full_jid = from;
312 origin.type = "c2s"; 313 origin.type = "c2s";
313 origin.log = module._log; 314 origin.log = log;
314 end 315 end
315 local payload, err = parse_request(request, path); 316 local payload, err = parse_request(request, path);
316 if not payload then 317 if not payload then
317 -- parse fail 318 -- parse fail
318 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, };
351 id = payload.attr.id or id.medium(), 352 id = payload.attr.id or id.medium(),
352 type = payload.attr.type, 353 type = payload.attr.type,
353 ["xml:lang"] = payload.attr["xml:lang"], 354 ["xml:lang"] = payload.attr["xml:lang"],
354 }; 355 };
355 356
356 module:log("debug", "Received[rest]: %s", payload:top_tag()); 357 log("debug", "Received[rest]: %s", payload:top_tag());
357 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)
358 359
359 if echo then 360 if echo then
360 local ret, err = errors.coerce(encode(send_type, payload)); 361 local ret, err = errors.coerce(encode(send_type, payload));
361 if not ret then return err; end 362 if not ret then return err; end
394 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);
395 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));
396 397
397 local p = module:send_iq(payload, origin, iq_timeout):next( 398 local p = module:send_iq(payload, origin, iq_timeout):next(
398 function (result) 399 function (result)
399 module:log("debug", "Sending[rest]: %s", result.stanza:top_tag()); 400 log("debug", "Sending[rest]: %s", result.stanza:top_tag());
400 response.headers.content_type = send_type; 401 response.headers.content_type = send_type;
401 if responses[1] then 402 if responses[1] then
402 local tail = responses[#responses]; 403 local tail = responses[#responses];
403 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
404 origin.send(result.stanza); 405 origin.send(result.stanza);
409 end 410 end
410 return encode(send_type, result.stanza); 411 return encode(send_type, result.stanza);
411 end, 412 end,
412 function (error) 413 function (error)
413 if not errors.is_err(error) then 414 if not errors.is_err(error) then
414 module:log("error", "Uncaught native error: %s", error); 415 log("error", "Uncaught native error: %s", error);
415 return select(2, errors.coerce(nil, error)); 416 return select(2, errors.coerce(nil, error));
416 elseif error.context and error.context.stanza then 417 elseif error.context and error.context.stanza then
417 response.headers.content_type = send_type; 418 response.headers.content_type = send_type;
418 module:log("debug", "Sending[rest]: %s", error.context.stanza:top_tag()); 419 log("debug", "Sending[rest]: %s", error.context.stanza:top_tag());
419 return encode(send_type, error.context.stanza); 420 return encode(send_type, error.context.stanza);
420 else 421 else
421 return error; 422 return error;
422 end 423 end
423 end); 424 end);
429 end 430 end
430 431
431 return p; 432 return p;
432 else 433 else
433 function origin.send(stanza) 434 function origin.send(stanza)
434 module:log("debug", "Sending[rest]: %s", stanza:top_tag()); 435 log("debug", "Sending[rest]: %s", stanza:top_tag());
435 response.headers.content_type = send_type; 436 response.headers.content_type = send_type;
436 response:send(encode(send_type, stanza)); 437 response:send(encode(send_type, stanza));
437 return true; 438 return true;
438 end 439 end
439 if compat_preevents(origin, payload) then return 202; end 440 if compat_preevents(origin, payload) then return 202; end