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 |
