File

net/server.lua @ 8269:25237002aba4

mod_limits: Handle fractional outstanding balance values (caused by e3f7b6fa46ba) Fractional values were passed to string.sub() when doing buffer manipulations, and caused random bytes to be skipped in the stream.
author Matthew Wild <mwild1@gmail.com>
date Tue, 26 Sep 2017 17:48:33 +0100
parent 7098:5286e79c6829
child 7099:8e64e7b82928
line wrap: on
line source

-- Prosody IM
-- Copyright (C) 2008-2010 Matthew Wild
-- Copyright (C) 2008-2010 Waqas Hussain
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--

local use_luaevent = prosody and require "core.configmanager".get("*", "use_libevent");

if use_luaevent then
	use_luaevent = pcall(require, "luaevent.core");
	if not use_luaevent then
		log("error", "libevent not found, falling back to select()");
	end
end

local server;

if use_luaevent then
	server = require "net.server_event";

	-- Overwrite signal.signal() because we need to ask libevent to
	-- handle them instead
	local ok, signal = pcall(require, "util.signal");
	if ok and signal then
		local _signal_signal = signal.signal;
		function signal.signal(signal_id, handler)
			if type(signal_id) == "string" then
				signal_id = signal[signal_id:upper()];
			end
			if type(signal_id) ~= "number" then
				return false, "invalid-signal";
			end
			return server.hook_signal(signal_id, handler);
		end
	end
else
	use_luaevent = false;
	server = require "net.server_select";
end

if prosody then
	local config_get = require "core.configmanager".get;
	local defaults = {};
	for k,v in pairs(server.cfg or server.getsettings()) do
		defaults[k] = v;
	end
	local function load_config()
		local settings = config_get("*", "network_settings") or {};
		if use_luaevent then
			local event_settings = {
				ACCEPT_DELAY = settings.accept_retry_interval;
				ACCEPT_QUEUE = settings.tcp_backlog;
				CLEAR_DELAY = settings.event_clear_interval;
				CONNECT_TIMEOUT = settings.connect_timeout;
				DEBUG = settings.debug;
				HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout;
				MAX_CONNECTIONS = settings.max_connections;
				MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips;
				MAX_READ_LENGTH = settings.max_receive_buffer_size;
				MAX_SEND_LENGTH = settings.max_send_buffer_size;
				READ_TIMEOUT = settings.read_timeout;
				WRITE_TIMEOUT = settings.send_timeout;
			};

			for k,default in pairs(defaults) do
				server.cfg[k] = event_settings[k] or default;
			end
		else
			local select_settings = {};
			for k,default in pairs(defaults) do
				select_settings[k] = settings[k] or default;
			end
			server.changesettings(select_settings);
		end
	end
	load_config();
	prosody.events.add_handler("config-reloaded", load_config);
end

-- require "net.server" shall now forever return this,
-- ie. server_select or server_event as chosen above.
return server;