Mercurial > prosody-modules
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 |