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