mod_rest: Handle internal http request errors early and then return
Skips over attempted parsing of the payload which usually failed since
the body is an error string like "connection refused", so this produced
useless errors.
module:set_global();
local stats = module:shared"stats";
local iter = require "util.iterators";
local count, keys = iter.count, iter.keys;
stats.stats = stats.stats or {};
stats.conns = stats.conns or {};
setmetatable(stats, {
__index = {
broadcast = function (self, stat)
local value = self.stats[stat];
for conn in pairs(self.conns) do
conn:write(stat..":"..value.."\n");
end
end;
adjust = function (self, stat, delta)
if delta == 0 then return; end
self.stats[stat] = (self.stats[stat] or 0) + delta;
self:broadcast(stat);
end;
set = function (self, stat, value)
if value == self.stats[stat] then return; end
self.stats[stat] = value;
self:broadcast(stat);
end;
add_conn = function (self, conn)
self.conns[conn] = true;
for stat, value in pairs(self.stats) do
conn:write(stat..":"..value.."\n");
end
end;
remove_conn = function (self, conn)
self.conns[conn] = nil;
end;
};
});
local network = {};
function network.onconnect(conn)
stats:add_conn(conn);
end
function network.onincoming(conn, data)
end
function network.ondisconnect(conn, reason)
stats:remove_conn(conn);
end
module:add_timer(1, function ()
stats:set("s2s-in", count(keys(prosody.incoming_s2s)));
return math.random(10, 20);
end);
module:add_timer(3, function ()
local s2sout_count = 0;
for _, host in pairs(prosody.hosts) do
s2sout_count = s2sout_count + count(keys(host.s2sout));
end
stats:set("s2s-out", s2sout_count);
return math.random(10, 20);
end);
function module.add_host(module)
module:hook("resource-bind", function ()
stats:adjust("c2s", 1);
end);
module:hook("resource-unbind", function ()
stats:adjust("c2s", -1);
end);
local c2s_count = 0;
for username, user in pairs(hosts[module.host].sessions or {}) do
for resource, session in pairs(user.sessions or {}) do
c2s_count = c2s_count + 1;
end
end
stats:set("c2s", c2s_count);
module:hook("s2sin-established", function (event)
stats:adjust("s2s-in", 1);
end);
module:hook("s2sin-destroyed", function (event)
stats:adjust("s2s-in", -1);
end);
module:hook("s2sout-established", function (event)
stats:adjust("s2s-out", 1);
end);
module:hook("s2sout-destroyed", function (event)
stats:adjust("s2s-out", -1);
end);
end
module:provides("net", {
default_port = 5444;
listener = network;
});