net/server.lua
author Kim Alvefur <zash@zash.se>
Fri, 03 Aug 2018 21:45:55 +0200
changeset 9093 56c52cb4d44e
parent 8714 9932a2a5b6de
child 9218 b087b5047f86
permissions -rw-r--r--
util.dataforms: Exclude descriptive text fields from forms of type 'submit' The receiving end presumably already have the original form, so these potentially long text fields are of little value.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2925
692b3c6c5bd2 Merge 0.6->0.7
Matthew Wild <mwild1@gmail.com>
parents: 2645 2923
diff changeset
     1
-- Prosody IM
692b3c6c5bd2 Merge 0.6->0.7
Matthew Wild <mwild1@gmail.com>
parents: 2645 2923
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
692b3c6c5bd2 Merge 0.6->0.7
Matthew Wild <mwild1@gmail.com>
parents: 2645 2923
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5531
diff changeset
     4
--
2925
692b3c6c5bd2 Merge 0.6->0.7
Matthew Wild <mwild1@gmail.com>
parents: 2645 2923
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
692b3c6c5bd2 Merge 0.6->0.7
Matthew Wild <mwild1@gmail.com>
parents: 2645 2923
diff changeset
     6
-- COPYING file in the source package for more information.
692b3c6c5bd2 Merge 0.6->0.7
Matthew Wild <mwild1@gmail.com>
parents: 2645 2923
diff changeset
     7
--
2162
22b6b1899a55 net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents: 2136
diff changeset
     8
8714
9932a2a5b6de net.server: Init a local logger (fixes traceback on attempt to warn about missing luaevent due to later loggingmanager initialization)
Kim Alvefur <zash@zash.se>
parents: 8703
diff changeset
     9
local log = require "util.logger".init("net.server");
8703
d611c46c6787 Backed out changeset a0f728c3aa69 in favor of 580c13ed0ca1
Kim Alvefur <zash@zash.se>
parents: 8689
diff changeset
    10
local server_type = prosody and require "core.configmanager".get("*", "network_backend") or "select";
d611c46c6787 Backed out changeset a0f728c3aa69 in favor of 580c13ed0ca1
Kim Alvefur <zash@zash.se>
parents: 8689
diff changeset
    11
if prosody and require "core.configmanager".get("*", "use_libevent") then
d611c46c6787 Backed out changeset a0f728c3aa69 in favor of 580c13ed0ca1
Kim Alvefur <zash@zash.se>
parents: 8689
diff changeset
    12
	server_type = "event";
6483
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    13
end
2094
c69cb5c171e0 net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
6483
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    15
if server_type == "event" then
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    16
	if not pcall(require, "luaevent.core") then
2162
22b6b1899a55 net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents: 2136
diff changeset
    17
		log("error", "libevent not found, falling back to select()");
6483
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    18
		server_type = "select"
2162
22b6b1899a55 net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents: 2136
diff changeset
    19
	end
22b6b1899a55 net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents: 2136
diff changeset
    20
end
22b6b1899a55 net.server: Log an error when libevent is requested, but luaevent is unavailable, and don't load luaevent when not requested.
Waqas Hussain <waqas20@gmail.com>
parents: 2136
diff changeset
    21
2094
c69cb5c171e0 net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
local server;
6483
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    23
local set_config;
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    24
if server_type == "event" then
4811
1d1fdfa29f06 net.server: server_select != server_event (thanks Nulani, Florob)
Matthew Wild <mwild1@gmail.com>
parents: 4808
diff changeset
    25
	server = require "net.server_event";
4808
07d0a3a75c8a net.server, net.timer, net.server_select: Rearrange dependencies between these three modules. server.addtimer() is no longer a public function (renamed to _addtimer) and is not available at all from server_event (compat code removed to prevent traceback) (thanks Nulani)
Matthew Wild <mwild1@gmail.com>
parents: 3461
diff changeset
    26
5385
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5383
diff changeset
    27
	local defaults = {};
6483
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    28
	for k,v in pairs(server.cfg) do
5385
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5383
diff changeset
    29
		defaults[k] = v;
d663483036db net.server, _select: Reorganise configuration of server_select to be more like server_event
Kim Alvefur <zash@zash.se>
parents: 5383
diff changeset
    30
	end
6483
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    31
	function set_config(settings)
7546
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    32
		local event_settings = {
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    33
			ACCEPT_DELAY = settings.accept_retry_interval;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    34
			ACCEPT_QUEUE = settings.tcp_backlog;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    35
			CLEAR_DELAY = settings.event_clear_interval;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    36
			CONNECT_TIMEOUT = settings.connect_timeout;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    37
			DEBUG = settings.debug;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    38
			HANDSHAKE_TIMEOUT = settings.ssl_handshake_timeout;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    39
			MAX_CONNECTIONS = settings.max_connections;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    40
			MAX_HANDSHAKE_ATTEMPTS = settings.max_ssl_handshake_roundtrips;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    41
			MAX_READ_LENGTH = settings.max_receive_buffer_size;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    42
			MAX_SEND_LENGTH = settings.max_send_buffer_size;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    43
			READ_TIMEOUT = settings.read_timeout;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    44
			WRITE_TIMEOUT = settings.send_timeout;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    45
		};
5198
430797a8fc81 net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents: 4811
diff changeset
    46
7546
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    47
		for k,default in pairs(defaults) do
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    48
			server.cfg[k] = event_settings[k] or default;
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    49
		end
6483
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    50
	end
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    51
elseif server_type == "select" then
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    52
	server = require "net.server_select";
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    53
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    54
	local defaults = {};
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    55
	for k,v in pairs(server.getsettings()) do
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    56
		defaults[k] = v;
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    57
	end
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
    58
	function set_config(settings)
7546
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    59
		local select_settings = {};
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    60
		for k,default in pairs(defaults) do
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    61
			select_settings[k] = settings[k] or default;
5198
430797a8fc81 net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents: 4811
diff changeset
    62
		end
7546
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    63
		server.changesettings(select_settings);
23a8a26e8912 net.server: Fix whitespace
Kim Alvefur <zash@zash.se>
parents: 7102
diff changeset
    64
	end
2094
c69cb5c171e0 net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
else
7548
0941b3ab77c0 net.server: Allow arbitrary network backends to be configured
Kim Alvefur <zash@zash.se>
parents: 7547
diff changeset
    66
	server = require("net.server_"..server_type);
0941b3ab77c0 net.server: Allow arbitrary network backends to be configured
Kim Alvefur <zash@zash.se>
parents: 7547
diff changeset
    67
	set_config = server.set_config;
7549
9606a99f8617 net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents: 7548
diff changeset
    68
	if not server.get_backend then
9606a99f8617 net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents: 7548
diff changeset
    69
		function server.get_backend()
9606a99f8617 net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents: 7548
diff changeset
    70
			return server_type;
9606a99f8617 net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents: 7548
diff changeset
    71
		end
9606a99f8617 net.server: Monkey-patch in a fallback get_backend method if missing
Kim Alvefur <zash@zash.se>
parents: 7548
diff changeset
    72
	end
2094
c69cb5c171e0 net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
end
c69cb5c171e0 net.server: New net.server to choose the appropriate library from server_select/server_event based on the availability of luaevent and the use_libevent config option
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
6485
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    75
-- If server.hook_signal exists, replace signal.signal()
6488
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    76
local has_signal, signal = pcall(require, "util.signal");
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    77
if has_signal then
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    78
	if server.hook_signal then
6485
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    79
		function signal.signal(signal_id, handler)
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    80
			if type(signal_id) == "string" then
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    81
				signal_id = signal[signal_id:upper()];
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    82
			end
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    83
			if type(signal_id) ~= "number" then
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    84
				return false, "invalid-signal";
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    85
			end
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    86
			return server.hook_signal(signal_id, handler);
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    87
		end
6488
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    88
	else
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    89
		server.hook_signal = signal.signal;
6485
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    90
	end
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    91
else
6488
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    92
	if not server.hook_signal then
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    93
		server.hook_signal = function()
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    94
			return false, "signal hooking not supported"
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    95
		end
4224abbf0fdd net/server: Handle lack of util.signal correctly
daurnimator <quae@daurnimator.com>
parents: 6487
diff changeset
    96
	end
6485
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    97
end
410067cdeb2f net/server: If server.hook_signal exists, overwrite signal.signal; else make server.hook_signal == signal.signal
daurnimator <quae@daurnimator.com>
parents: 6483
diff changeset
    98
7547
fb68aad9dc4d net.server: Only update configuration if server backend supports changing settings
Kim Alvefur <zash@zash.se>
parents: 7546
diff changeset
    99
if prosody and set_config then
5198
430797a8fc81 net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents: 4811
diff changeset
   100
	local config_get = require "core.configmanager".get;
430797a8fc81 net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents: 4811
diff changeset
   101
	local function load_config()
5383
143670deee3e net.server: No sections in config anymore
Kim Alvefur <zash@zash.se>
parents: 5284
diff changeset
   102
		local settings = config_get("*", "network_settings") or {};
6483
37b12475f648 net/server: Split up different backends in a nicer way. Add global config option 'server'
daurnimator <quae@daurnimator.com>
parents: 5776
diff changeset
   103
		return set_config(settings);
5198
430797a8fc81 net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents: 4811
diff changeset
   104
	end
430797a8fc81 net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents: 4811
diff changeset
   105
	load_config();
430797a8fc81 net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents: 4811
diff changeset
   106
	prosody.events.add_handler("config-reloaded", load_config);
430797a8fc81 net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents: 4811
diff changeset
   107
end
430797a8fc81 net.server: Make server_* configurable in the config file.
Kim Alvefur <zash@zash.se>
parents: 4811
diff changeset
   108
2136
23c687039652 net.server: Add some comments to explain to waqas how it all works :)
Matthew Wild <mwild1@gmail.com>
parents: 2105
diff changeset
   109
-- require "net.server" shall now forever return this,
23c687039652 net.server: Add some comments to explain to waqas how it all works :)
Matthew Wild <mwild1@gmail.com>
parents: 2105
diff changeset
   110
-- ie. server_select or server_event as chosen above.
2645
625d02b2a1a0 net.server: Remove redundant commented code and some trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2435
diff changeset
   111
return server;