Software / code / prosody
Comparison
core/moduleapi.lua @ 9748:99199b53019f
core.moduleapi: Use util.error for :send_iq errors
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 30 Dec 2018 16:03:15 +0100 |
| parent | 9747:c8240f931a68 |
| child | 9750:65432dc80d90 |
comparison
equal
deleted
inserted
replaced
| 9747:c8240f931a68 | 9748:99199b53019f |
|---|---|
| 13 local pluginloader = require "util.pluginloader"; | 13 local pluginloader = require "util.pluginloader"; |
| 14 local timer = require "util.timer"; | 14 local timer = require "util.timer"; |
| 15 local resolve_relative_path = require"util.paths".resolve_relative_path; | 15 local resolve_relative_path = require"util.paths".resolve_relative_path; |
| 16 local st = require "util.stanza"; | 16 local st = require "util.stanza"; |
| 17 local cache = require "util.cache"; | 17 local cache = require "util.cache"; |
| 18 local errutil = require "util.error"; | |
| 18 local promise = require "util.promise"; | 19 local promise = require "util.promise"; |
| 19 | 20 |
| 20 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat; | 21 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat; |
| 21 local error, setmetatable, type = error, setmetatable, type; | 22 local error, setmetatable, type = error, setmetatable, type; |
| 22 local ipairs, pairs, select = ipairs, pairs, select; | 23 local ipairs, pairs, select = ipairs, pairs, select; |
| 365 | 366 |
| 366 function api:send_iq(stanza, origin, timeout) | 367 function api:send_iq(stanza, origin, timeout) |
| 367 local iq_cache = self._iq_cache; | 368 local iq_cache = self._iq_cache; |
| 368 if not iq_cache then | 369 if not iq_cache then |
| 369 iq_cache = cache.new(256, function (_, iq) | 370 iq_cache = cache.new(256, function (_, iq) |
| 370 iq.reject("evicted"); | 371 iq.reject(errutil.new({ |
| 372 type = "wait", condition = "resource-constraint", | |
| 373 text = "evicted from iq tracking cache" | |
| 374 })); | |
| 371 self:unhook(iq.result_event, iq.result_handler); | 375 self:unhook(iq.result_event, iq.result_handler); |
| 372 self:unhook(iq.error_event, iq.error_handler); | 376 self:unhook(iq.error_event, iq.error_handler); |
| 373 end); | 377 end); |
| 374 self._iq_cache = iq_cache; | 378 self._iq_cache = iq_cache; |
| 375 end | 379 end |
| 391 end | 395 end |
| 392 end | 396 end |
| 393 | 397 |
| 394 local function error_handler(event) | 398 local function error_handler(event) |
| 395 if event.stanza.attr.from == stanza.attr.to then | 399 if event.stanza.attr.from == stanza.attr.to then |
| 396 reject(event); | 400 local error_type, condition, text = event.stanza:get_error(); |
| 401 local err = errutil.new({ type = error_type, condition = condition, text = text }, event); | |
| 402 reject(err); | |
| 397 return true; | 403 return true; |
| 398 end | 404 end |
| 399 end | 405 end |
| 400 | 406 |
| 401 if iq_cache:get(cache_key) then | 407 if iq_cache:get(cache_key) then |
| 402 error("choose another iq stanza id attribute") | 408 reject(errutil.new({ |
| 409 type = "modify", condition = "conflict", | |
| 410 text = "iq stanza id attribute already used", | |
| 411 })); | |
| 412 return; | |
| 403 end | 413 end |
| 404 | 414 |
| 405 self:hook(result_event, result_handler); | 415 self:hook(result_event, result_handler); |
| 406 self:hook(error_event, error_handler); | 416 self:hook(error_event, error_handler); |
| 407 | 417 |
| 408 local timeout_handle = self:add_timer(timeout or 120, function () | 418 local timeout_handle = self:add_timer(timeout or 120, function () |
| 409 reject("timeout"); | 419 reject(errutil.new({ |
| 420 type = "wait", condition = "remote-server-timeout", | |
| 421 text = "IQ stanza timed out", | |
| 422 })); | |
| 410 self:unhook(result_event, result_handler); | 423 self:unhook(result_event, result_handler); |
| 411 self:unhook(error_event, error_handler); | 424 self:unhook(error_event, error_handler); |
| 412 iq_cache:set(cache_key, nil); | 425 iq_cache:set(cache_key, nil); |
| 413 end); | 426 end); |
| 414 | 427 |
| 418 result_event = result_event, error_event = error_event, | 431 result_event = result_event, error_event = error_event, |
| 419 result_handler = result_handler, error_handler = error_handler; | 432 result_handler = result_handler, error_handler = error_handler; |
| 420 }); | 433 }); |
| 421 | 434 |
| 422 if not ok then | 435 if not ok then |
| 423 reject("cache insertion failure"); | 436 reject(errutil.new({ |
| 437 type = "wait", condition = "internal-server-error", | |
| 438 text = "Could not store IQ tracking data" | |
| 439 })); | |
| 424 return; | 440 return; |
| 425 end | 441 end |
| 426 | 442 |
| 427 self:send(stanza, origin); | 443 self:send(stanza, origin); |
| 428 end); | 444 end); |