net.server_epoll: Add support for systemd socket activation
Allows creating listening sockets and accepting client connections
before Prosody starts.
This is unlike normal Prosody dynamic resource management, where ports
may added and removed at any time, and the ports defined by the config.
Weird things happen if these are closed (e.g. due to reload) so here we
prevent closing and ensure sockets are reused when opened again.
-- Generate net/http/codes.lua from IANA HTTP status code registry
if not pcall(require, "prosody.loader") then
pcall(require, "loader");
end
local xml = require "prosody.util.xml";
local registry = xml.parse(io.read("*a"), { allow_processing_instructions = true });
io.write([[
local response_codes = {
-- Source: http://www.iana.org/assignments/http-status-codes
]]);
for record in registry:get_child("registry"):childtags("record") do
-- Extract values
local value = record:get_child_text("value");
local description = record:get_child_text("description");
local ref = record:get_child_text("xref");
local code = tonumber(value);
-- Space between major groups
if code and code % 100 == 0 then
io.write("\n");
end
-- Reserved and Unassigned entries should be not be included
if description == "Reserved" or description == "Unassigned" or description == "(Unused)" then
code = nil;
end
-- Non-empty references become comments
if ref and ref:find("%S") then
ref = " -- " .. ref;
else
ref = "";
end
io.write((code and "\t[%d] = %q;%s\n" or "\t-- [%s] = %q;%s\n"):format(code or value, description, ref));
end
io.write([[};
for k,v in pairs(response_codes) do response_codes[k] = k.." "..v; end
return setmetatable(response_codes, { __index = function(_, k) return k.." Unassigned"; end })
]]);