net/server_epoll.lua
author Kim Alvefur <zash@zash.se>
Wed, 14 Jul 2021 22:09:39 +0200
changeset 11691 153d2fdd97d3
parent 11690 f4c3dcc907d8
child 11692 3fc564f7441b
permissions -rw-r--r--
net.server_epoll: Add way to enable TCP keeplives on all connections In case one wishes to enable this for all connections, not just c2s (not Direct TLS ones, because LuaSec) and s2s. Unclear what use these are, since they kick in after 2 hours of idle time.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- Prosody IM
9477
619ba78709a5 net.server_epoll: Update copyright year
Kim Alvefur <zash@zash.se>
parents: 9476
diff changeset
     2
-- Copyright (C) 2016-2018 Kim Alvefur
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
--
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
-- This project is MIT/X11 licensed. Please see the
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
-- COPYING file in the source package for more information.
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
--
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local t_insert = table.insert;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
local t_concat = table.concat;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local setmetatable = setmetatable;
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
    12
local pcall = pcall;
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
    13
local type = type;
7800
d0c32d86724f server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents: 7799
diff changeset
    14
local next = next;
7797
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
    15
local pairs = pairs;
11417
9fb23779c863 net.server_epoll: Support for passing DANE TLSA data to LuaSec (0.8 needed)
Kim Alvefur <zash@zash.se>
parents: 11271
diff changeset
    16
local ipairs = ipairs;
10590
f86ed818a7f8 net.server_epoll: Collect full traceback from errors in listeners
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
    17
local traceback = debug.traceback;
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
    18
local logger = require "util.logger";
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
    19
local log = logger.init("server_epoll");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
local socket = require "socket";
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
local luasec = require "ssl";
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
    22
local realtime = require "util.time".now;
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
    23
local monotonic = require "util.time".monotonic;
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
    24
local indexedbheap = require "util.indexedbheap";
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
local createtable = require "util.table".create;
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
    26
local inet = require "util.net";
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
    27
local inet_pton = inet.pton;
7740
f93b3083b46b net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents: 7710
diff changeset
    28
local _SOCKETINVALID = socket._SOCKETINVALID or -1;
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
    29
local new_id = require "util.id".medium;
10590
f86ed818a7f8 net.server_epoll: Collect full traceback from errors in listeners
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
    30
local xpcall = require "util.xpcall".xpcall;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
9509
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
    32
local poller = require "util.poll"
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
    33
local EEXIST = poller.EEXIST;
9510
33d21f020b66 net.server_epoll: Ignore ENOENT when deregitering socket
Kim Alvefur <zash@zash.se>
parents: 9509
diff changeset
    34
local ENOENT = poller.ENOENT;
9509
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
    35
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
    36
local poll = assert(poller.new());
7604
ce20546d7714 net.server_epoll: Make sure a recent LuaSocket is avaliable
Kim Alvefur <zash@zash.se>
parents: 7603
diff changeset
    37
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8555
diff changeset
    39
-- luacheck: std none
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
7660
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
    41
local default_config = { __index = {
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    42
	-- If a connection is silent for this long, close it unless onreadtimeout says not to
8986
23f66f04e216 net.server: Set default read timeout to 14 minutes (fixes #971)
Kim Alvefur <zash@zash.se>
parents: 8784
diff changeset
    43
	read_timeout = 14 * 60;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    44
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    45
	-- How long to wait for a socket to become writable after queuing data to send
9829
5ccce16c6449 net.server_epoll: Increase send_timeout to 3 minutes (to match server_event)
Kim Alvefur <zash@zash.se>
parents: 9828
diff changeset
    46
	send_timeout = 180;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    47
9828
729de68f0068 net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents: 9827
diff changeset
    48
	-- How long to wait for a socket to become writable after creation
729de68f0068 net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents: 9827
diff changeset
    49
	connect_timeout = 20;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    50
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    51
	-- Some number possibly influencing how many pending connections can be accepted
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
	tcp_backlog = 128;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    53
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    54
	-- If accepting a new incoming connection fails, wait this long before trying again
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
	accept_retry_interval = 10;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    56
11675
4e4e26e3df8d net.server_epoll: Fix typo
Kim Alvefur <zash@zash.se>
parents: 11669
diff changeset
    57
	-- If there is still more data to read from LuaSockets buffer, wait this long and read again
7563
785fa1138293 net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents: 7562
diff changeset
    58
	read_retry_delay = 1e-06;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    59
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    60
	-- Size of chunks to read from sockets
9314
9b0604fe01f1 net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents: 9313
diff changeset
    61
	read_size = 8192;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    62
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    63
	-- Timeout used during between steps in TLS handshakes
9826
13c2707d2417 net.server_epoll: Rename handshake_timeout to ssl_handshake_timeout (fixes #1319)
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
    64
	ssl_handshake_timeout = 60;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    65
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    66
	-- Maximum and minimum amount of time to sleep waiting for events (adjusted for pending timers)
7626
a1c040a5754f net.server_epoll: Make maximum wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7609
diff changeset
    67
	max_wait = 86400;
7661
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7660
diff changeset
    68
	min_wait = 1e-06;
10085
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10084
diff changeset
    69
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
    70
	-- Enable extra noisy debug logging
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
    71
	-- TODO disable once considered stable
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
    72
	verbose = true;
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
    73
10085
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10084
diff changeset
    74
	-- EXPERIMENTAL
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10084
diff changeset
    75
	-- Whether to kill connections in case of callback errors.
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10084
diff changeset
    76
	fatal_errors = false;
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
    77
10996
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
    78
	-- Or disable protection (like server_select) for potential performance gains
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
    79
	protect_listeners = true;
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
    80
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
    81
	-- Attempt writes instantly
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
    82
	opportunistic_writes = false;
11691
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
    83
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
    84
	-- TCP Keepalives
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
    85
	tcp_keepalive = false; -- boolean | number
7660
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
    86
}};
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
    87
local cfg = default_config.__index;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    89
local fds = createtable(10, 0); -- FD -> conn
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
    90
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
    91
-- Timer and scheduling --
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
    92
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
    93
local timers = indexedbheap.create();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    94
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
local function noop() end
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
    96
local function closetimer(id)
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
    97
	timers:remove(id);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    99
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   100
local function reschedule(id, time)
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   101
	time = monotonic() + time;
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   102
	timers:reprioritize(id, time);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   103
end
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   104
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   105
-- Add relative timer
10986
276f16101d59 net.server_epoll: Make API-compatible with util.timer
Kim Alvefur <zash@zash.se>
parents: 10865
diff changeset
   106
local function addtimer(timeout, f, param)
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   107
	local time = monotonic() + timeout;
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   108
	if param ~= nil then
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   109
		local timer_callback = f
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   110
		function f(current_time, timer_id)
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   111
			local t = timer_callback(current_time, timer_id, param)
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   112
			return t;
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   113
		end
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   114
	end
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   115
	local id = timers:insert(f, time);
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   116
	return id;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   117
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   118
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   119
-- Run callbacks of expired timers
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   120
-- Return time until next timeout
7661
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7660
diff changeset
   121
local function runtimers(next_delay, min_wait)
7632
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7631
diff changeset
   122
	-- Any timers at all?
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   123
	local elapsed = monotonic();
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   124
	local now = realtime();
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   125
	local peek = timers:peek();
11266
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   126
	local readd;
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   127
	while peek do
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   128
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   129
		if peek > elapsed then
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   130
			break;
10685
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10063
diff changeset
   131
		end
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   132
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   133
		local _, timer, id = timers:pop();
10994
03e76ad725b2 net.server_epoll: ... and include a traceback
Kim Alvefur <zash@zash.se>
parents: 10993
diff changeset
   134
		local ok, ret = xpcall(timer, traceback, now, id);
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   135
		if ok and type(ret) == "number"  then
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   136
			local next_time = elapsed+ret;
11266
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   137
			-- Delay insertion of timers to be re-added
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   138
			-- so they don't get called again this tick
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   139
			if readd then
11268
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11243 11266
diff changeset
   140
				readd[id] = { timer, next_time };
11266
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   141
			else
11268
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11243 11266
diff changeset
   142
				readd = { [id] = { timer, next_time } };
11266
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   143
			end
10993
b824fe9d0c8b net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
   144
		elseif not ok then
b824fe9d0c8b net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
   145
			log("error", "Error in timer: %s", ret);
10685
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10063
diff changeset
   146
		end
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   147
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   148
		peek = timers:peek();
10685
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10063
diff changeset
   149
	end
11266
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   150
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   151
	if readd then
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   152
		for _, timer in pairs(readd) do
11268
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11243 11266
diff changeset
   153
			timers:insert(timer[1], timer[2]);
11266
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   154
		end
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   155
		peek = timers:peek();
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   156
	end
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   157
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   158
	if peek == nil then
7632
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7631
diff changeset
   159
		return next_delay;
11266
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   160
	else
11268
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11243 11266
diff changeset
   161
		next_delay = peek - elapsed;
7632
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7631
diff changeset
   162
	end
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7631
diff changeset
   163
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   164
	if next_delay < min_wait then
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   165
		return min_wait;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   166
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   167
	return next_delay;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   168
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   169
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   170
-- Socket handler interface
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   171
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   172
local interface = {};
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   173
local interface_mt = { __index = interface };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   174
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   175
function interface_mt:__tostring()
7588
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7587
diff changeset
   176
	if self.sockname and self.peername then
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7587
diff changeset
   177
		return ("FD %d (%s, %d, %s, %d)"):format(self:getfd(), self.peername, self.peerport, self.sockname, self.sockport);
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7587
diff changeset
   178
	elseif self.sockname or self.peername then
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7587
diff changeset
   179
		return ("FD %d (%s, %d)"):format(self:getfd(), self.sockname or self.peername, self.sockport or self.peerport);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   180
	end
9324
146dc1e4c7ff net.server_epoll: Simplify minimal string representation
Kim Alvefur <zash@zash.se>
parents: 9323
diff changeset
   181
	return ("FD %d"):format(self:getfd());
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   182
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   183
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   184
interface.log = log;
11501
960674938665 net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 11417
diff changeset
   185
function interface:debug(msg, ...)
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   186
	self.log("debug", msg, ...);
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   187
end
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   188
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   189
interface.noise = interface.debug;
11501
960674938665 net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 11417
diff changeset
   190
function interface:noise(msg, ...)
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   191
	if cfg.verbose then
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   192
		return self:debug(msg, ...);
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   193
	end
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   194
end
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   195
11501
960674938665 net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 11417
diff changeset
   196
function interface:error(msg, ...)
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   197
	self.log("error", msg, ...);
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   198
end
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   199
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   200
-- Replace the listener and tell the old one
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   201
function interface:setlistener(listeners, data)
7607
36408ef6c8c9 net.server_epoll: Call ondetach when listeners are replaced
Kim Alvefur <zash@zash.se>
parents: 7606
diff changeset
   202
	self:on("detach");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   203
	self.listeners = listeners;
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   204
	self:on("attach", data);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   205
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   206
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   207
-- Call a listener callback
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   208
function interface:on(what, ...)
8009
be374a5778f3 net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents: 7913
diff changeset
   209
	if not self.listeners then
10593
3540118699cf net.server_epoll: Log error about missing *all* callbacks at 'error' level
Kim Alvefur <zash@zash.se>
parents: 10592
diff changeset
   210
		self:error("Interface is missing listener callbacks");
8009
be374a5778f3 net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents: 7913
diff changeset
   211
		return;
be374a5778f3 net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents: 7913
diff changeset
   212
	end
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   213
	local listener = self.listeners["on"..what];
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   214
	if not listener then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   215
		self:noise("Missing listener 'on%s'", what); -- uncomment for development and debugging
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   216
		return;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   217
	end
10996
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
   218
	if not cfg.protect_listeners then
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
   219
		return listener(self, ...);
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
   220
	end
10995
aa85cb5b859f net.server_epoll: Allow setting a custom error handler for listener
Kim Alvefur <zash@zash.se>
parents: 10994
diff changeset
   221
	local onerror = self.listeners.onerror or traceback;
aa85cb5b859f net.server_epoll: Allow setting a custom error handler for listener
Kim Alvefur <zash@zash.se>
parents: 10994
diff changeset
   222
	local ok, err = xpcall(listener, onerror, self, ...);
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   223
	if not ok then
10085
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10084
diff changeset
   224
		if cfg.fatal_errors then
10592
ceadf3d3fecf net.server_epoll: Log errors caught in listeners on 'error' level
Kim Alvefur <zash@zash.se>
parents: 10591
diff changeset
   225
			self:error("Closing due to error calling on%s: %s", what, err);
10085
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10084
diff changeset
   226
			self:destroy();
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   227
		else
11243
06a5919e2496 net.server_epoll: Increase log level for error in callback
Kim Alvefur <zash@zash.se>
parents: 11072
diff changeset
   228
			self:error("Error calling on%s: %s", what, err);
10085
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10084
diff changeset
   229
		end
10084
39ca4202ae1e net.server_epoll: Return listener error message
Kim Alvefur <zash@zash.se>
parents: 10065
diff changeset
   230
		return nil, err;
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   231
	end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   232
	return err;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   233
end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   234
10282
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   235
-- Allow this one to be overridden
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   236
function interface:onincoming(...)
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   237
	return self:on("incoming", ...);
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   238
end
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   239
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   240
-- Return the file descriptor number
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   241
function interface:getfd()
7589
846fdbbc62ba net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents: 7588
diff changeset
   242
	if self.conn then
846fdbbc62ba net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents: 7588
diff changeset
   243
		return self.conn:getfd();
846fdbbc62ba net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents: 7588
diff changeset
   244
	end
7740
f93b3083b46b net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents: 7710
diff changeset
   245
	return _SOCKETINVALID;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   246
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   247
8274
c09deab9989e net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents: 8094
diff changeset
   248
function interface:server()
c09deab9989e net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents: 8094
diff changeset
   249
	return self._server or self;
c09deab9989e net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents: 8094
diff changeset
   250
end
c09deab9989e net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents: 8094
diff changeset
   251
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   252
-- Get IP address
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   253
function interface:ip()
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   254
	return self.peername or self.sockname;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   255
end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   256
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   257
-- Get a port number, doesn't matter which
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   258
function interface:port()
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   259
	return self.sockport or self.peerport;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   260
end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   261
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   262
-- Get local port number
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   263
function interface:clientport()
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   264
	return self.sockport;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   265
end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   266
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   267
-- Get remote port
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   268
function interface:serverport()
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   269
	if self.sockport then
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   270
		return self.sockport;
8274
c09deab9989e net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents: 8094
diff changeset
   271
	elseif self._server then
c09deab9989e net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents: 8094
diff changeset
   272
		self._server:port();
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   273
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   274
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   275
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   276
-- Return underlying socket
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   277
function interface:socket()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   278
	return self.conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   279
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   280
7913
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7820
diff changeset
   281
function interface:set_mode(new_mode)
9313
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9312
diff changeset
   282
	self.read_size = new_mode;
7913
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7820
diff changeset
   283
end
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7820
diff changeset
   284
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   285
function interface:setoption(k, v)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   286
	-- LuaSec doesn't expose setoption :(
11689
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   287
	local ok, ret, err = pcall(self.conn.setoption, self.conn, k, v);
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   288
	if not ok then
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   289
		self:noise("Setting option %q = %q failed: %s", k, v, ret);
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   290
		return ok, ret;
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   291
	elseif not ret then
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   292
		self:noise("Setting option %q = %q failed: %s", k, v, err);
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   293
		return ret, err;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   294
	end
11689
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   295
	return ret;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   296
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   297
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   298
-- Timeout for detecting dead or idle sockets
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   299
function interface:setreadtimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   300
	if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   301
		if self._readtimeout then
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   302
			closetimer(self._readtimeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   303
			self._readtimeout = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   304
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   305
		return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   306
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   307
	t = t or cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   308
	if self._readtimeout then
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   309
		reschedule(self._readtimeout, t);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   310
	else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   311
		self._readtimeout = addtimer(t, function ()
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   312
			if self:on("readtimeout") then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   313
				self:noise("Read timeout handled");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   314
				return cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   315
			else
10421
d8a0b0d21c81 net.server_epoll: Improve read timeout debug messages
Kim Alvefur <zash@zash.se>
parents: 10420
diff changeset
   316
				self:debug("Read timeout not handled, disconnecting");
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   317
				self:on("disconnect", "read timeout");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   318
				self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   319
			end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   320
		end);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   321
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   322
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   323
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   324
-- Timeout for detecting dead sockets
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   325
function interface:setwritetimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   326
	if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   327
		if self._writetimeout then
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   328
			closetimer(self._writetimeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   329
			self._writetimeout = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   330
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   331
		return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   332
	end
9825
7712488c8e49 net.server_epoll: Use send_timeout for write timout like other implementations (fixes #1316)
Kim Alvefur <zash@zash.se>
parents: 9669
diff changeset
   333
	t = t or cfg.send_timeout;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   334
	if self._writetimeout then
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   335
		reschedule(self._writetimeout, t);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   336
	else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   337
		self._writetimeout = addtimer(t, function ()
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   338
			self:noise("Write timeout");
10642
92918212ee83 net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents: 10593
diff changeset
   339
			self:on("disconnect", self._connected and "write timeout" or "connection timeout");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   340
			self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   341
		end);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   342
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   343
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   344
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   345
function interface:add(r, w)
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   346
	local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   347
	if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   348
		return nil, "invalid fd";
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   349
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   350
	if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   351
	if w == nil then w = self._wantwrite; end
9387
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9386
diff changeset
   352
	local ok, err, errno = poll:add(fd, r, w);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   353
	if not ok then
9509
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   354
		if errno == EEXIST then
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   355
			self:debug("FD already registered in poller! (EEXIST)");
9509
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   356
			return self:set(r, w); -- So try to change its flags
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   357
		end
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   358
		self:debug("Could not register in poller: %s(%d)", err, errno);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   359
		return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   360
	end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   361
	self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   362
	fds[fd] = self;
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   363
	self:noise("Registered in poller");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   364
	return true;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   365
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   366
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   367
function interface:set(r, w)
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   368
	local fd = self:getfd();
7605
a4d5eec36a17 net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents: 7604
diff changeset
   369
	if fd < 0 then
a4d5eec36a17 net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents: 7604
diff changeset
   370
		return nil, "invalid fd";
a4d5eec36a17 net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents: 7604
diff changeset
   371
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   372
	if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   373
	if w == nil then w = self._wantwrite; end
9387
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9386
diff changeset
   374
	local ok, err, errno = poll:set(fd, r, w);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   375
	if not ok then
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   376
		self:debug("Could not update poller state: %s(%d)", err, errno);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   377
		return ok, err;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   378
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   379
	self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   380
	return true;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   381
end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   382
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   383
function interface:del()
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   384
	local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   385
	if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   386
		return nil, "invalid fd";
7628
6afafd6d4ef0 net.server_epoll: Move management of fd registry to :setflags
Kim Alvefur <zash@zash.se>
parents: 7627
diff changeset
   387
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   388
	if fds[fd] ~= self then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   389
		return nil, "unregistered fd";
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   390
	end
9387
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9386
diff changeset
   391
	local ok, err, errno = poll:del(fd);
9510
33d21f020b66 net.server_epoll: Ignore ENOENT when deregitering socket
Kim Alvefur <zash@zash.se>
parents: 9509
diff changeset
   392
	if not ok and errno ~= ENOENT then
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   393
		self:debug("Could not unregister: %s(%d)", err, errno);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   394
		return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   395
	end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   396
	self._wantread, self._wantwrite = nil, nil;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   397
	fds[fd] = nil;
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   398
	self:noise("Unregistered from poller");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   399
	return true;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   400
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   401
9323
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   402
function interface:setflags(r, w)
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   403
	if not(self._wantread or self._wantwrite) then
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   404
		if not(r or w) then
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   405
			return true; -- no change
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   406
		end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   407
		return self:add(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   408
	end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   409
	if not(r or w) then
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   410
		return self:del();
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   411
	end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   412
	return self:set(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   413
end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   414
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   415
-- Called when socket is readable
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   416
function interface:onreadable()
9314
9b0604fe01f1 net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents: 9313
diff changeset
   417
	local data, err, partial = self.conn:receive(self.read_size or cfg.read_size);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   418
	if data then
8543
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   419
		self:onconnect();
10282
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   420
		self:onincoming(data);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   421
	else
9935
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   422
		if err == "wantread" then
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   423
			self:set(true, nil);
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   424
			err = "timeout";
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   425
		elseif err == "wantwrite" then
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   426
			self:set(nil, true);
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   427
			err = "timeout";
11596
64cfa396bb84 net.server_epoll: Fix reporting of socket connect timeout
Kim Alvefur <zash@zash.se>
parents: 11501
diff changeset
   428
		elseif err == "timeout" and not self._connected then
64cfa396bb84 net.server_epoll: Fix reporting of socket connect timeout
Kim Alvefur <zash@zash.se>
parents: 11501
diff changeset
   429
			err = "connection timeout";
9935
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   430
		end
8543
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   431
		if partial and partial ~= "" then
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   432
			self:onconnect();
10282
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   433
			self:onincoming(partial, err);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   434
		end
9935
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   435
		if err ~= "timeout" then
11018
05fefde93036 net.server_epoll: Log debug message when a connection errors on read
Kim Alvefur <zash@zash.se>
parents: 10996
diff changeset
   436
			if err == "closed" then
05fefde93036 net.server_epoll: Log debug message when a connection errors on read
Kim Alvefur <zash@zash.se>
parents: 10996
diff changeset
   437
				self:debug("Connection closed by remote");
05fefde93036 net.server_epoll: Log debug message when a connection errors on read
Kim Alvefur <zash@zash.se>
parents: 10996
diff changeset
   438
			else
05fefde93036 net.server_epoll: Log debug message when a connection errors on read
Kim Alvefur <zash@zash.se>
parents: 10996
diff changeset
   439
				self:debug("Read error, closing (%s)", err);
05fefde93036 net.server_epoll: Log debug message when a connection errors on read
Kim Alvefur <zash@zash.se>
parents: 10996
diff changeset
   440
			end
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   441
			self:on("disconnect", err);
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   442
			self:destroy()
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   443
			return;
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   444
		end
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   445
	end
7694
a5ad858f3a93 net.server_epoll: Check that connection still exists after callback, fixes traceback when closed
Kim Alvefur <zash@zash.se>
parents: 7690
diff changeset
   446
	if not self.conn then return; end
10102
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   447
	if self._limit and (data or partial) then
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   448
		local cost = self._limit * #(data or partial);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   449
		if cost > cfg.min_wait then
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   450
			self:setreadtimeout(false);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   451
			self:pausefor(cost);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   452
			return;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   453
		end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   454
	end
9936
df73ca804719 net.server_epoll: Skip delayed continuation read on paused connections
Kim Alvefur <zash@zash.se>
parents: 9935
diff changeset
   455
	if self._wantread and self.conn:dirty() then
7609
f40f1d9b7872 net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents: 7607
diff changeset
   456
		self:setreadtimeout(false);
f40f1d9b7872 net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents: 7607
diff changeset
   457
		self:pausefor(cfg.read_retry_delay);
f40f1d9b7872 net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents: 7607
diff changeset
   458
	else
f40f1d9b7872 net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents: 7607
diff changeset
   459
		self:setreadtimeout();
f40f1d9b7872 net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents: 7607
diff changeset
   460
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   461
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   462
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   463
-- Called when socket is writable
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   464
function interface:onwritable()
8555
1fcefc16a55d server_epoll: Onconnect should happen before first attempt to write to socket
Kim Alvefur <zash@zash.se>
parents: 8545
diff changeset
   465
	self:onconnect();
8779
e7d4344e0fea net.server_epoll: Handle connection being closed and destroyed in onconnect callback
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   466
	if not self.conn then return; end -- could have been closed in onconnect
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   467
	local buffer = self.writebuffer;
10575
cfeb0077c9e9 net.server_epoll: Avoid concatenating buffer with single item
Kim Alvefur <zash@zash.se>
parents: 10550
diff changeset
   468
	local data = #buffer == 1 and buffer[1] or t_concat(buffer);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   469
	local ok, err, partial = self.conn:send(data);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   470
	if ok then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   471
		self:set(nil, false);
8544
8186114329d6 net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents: 8543
diff changeset
   472
		for i = #buffer, 1, -1 do
8186114329d6 net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents: 8543
diff changeset
   473
			buffer[i] = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   474
		end
8544
8186114329d6 net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents: 8543
diff changeset
   475
		self:setwritetimeout(false);
8186114329d6 net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents: 8543
diff changeset
   476
		self:ondrain(); -- Be aware of writes in ondrain
7592
125e4f2e0b65 net.server_epoll: Return early on successful write
Kim Alvefur <zash@zash.se>
parents: 7591
diff changeset
   477
		return;
8543
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   478
	elseif partial then
10309
2fadbf209678 net.server_epoll: Log size of partial writes (debug)
Kim Alvefur <zash@zash.se>
parents: 10304
diff changeset
   479
		self:debug("Sent %d out of %d buffered bytes", partial, #data);
7594
138f16eb39fb net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
   480
		buffer[1] = data:sub(partial+1);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   481
		for i = #buffer, 2, -1 do
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   482
			buffer[i] = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   483
		end
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   484
		self:set(nil, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   485
		self:setwritetimeout();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   486
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   487
	if err == "wantwrite" or err == "timeout" then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   488
		self:set(nil, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   489
	elseif err == "wantread" then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   490
		self:set(true, nil);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   491
	elseif err ~= "timeout" then
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   492
		self:on("disconnect", err);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   493
		self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   494
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   495
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   496
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   497
-- The write buffer has been successfully emptied
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   498
function interface:ondrain()
8011
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8010
diff changeset
   499
	return self:on("drain");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   500
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   501
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   502
-- Add data to write buffer and set flag for wanting to write
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   503
function interface:write(data)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   504
	local buffer = self.writebuffer;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   505
	if buffer then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   506
		t_insert(buffer, data);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   507
	else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   508
		self.writebuffer = { data };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   509
	end
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   510
	if not self._write_lock then
11669
148075532021 net.server_epoll: Prevent stack overflow of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11664
diff changeset
   511
		if cfg.opportunistic_writes and not self._opportunistic_write then
148075532021 net.server_epoll: Prevent stack overflow of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11664
diff changeset
   512
			self._opportunistic_write = true;
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   513
			self:onwritable();
11669
148075532021 net.server_epoll: Prevent stack overflow of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11664
diff changeset
   514
			self._opportunistic_write = nil;
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   515
			return #data;
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   516
		end
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   517
		self:setwritetimeout();
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   518
		self:set(nil, true);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   519
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   520
	return #data;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   521
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   522
interface.send = interface.write;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   523
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   524
-- Close, possibly after writing is done
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   525
function interface:close()
8010
67f8954875a4 net.server_epoll: Check write buffer for remaining data to write when closing
Kim Alvefur <zash@zash.se>
parents: 8009
diff changeset
   526
	if self.writebuffer and self.writebuffer[1] then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   527
		self:set(false, true); -- Flush final buffer contents
11662
36942fa001b4 net.server_epoll: Ensure timeout after closing
Kim Alvefur <zash@zash.se>
parents: 11599
diff changeset
   528
		self:setwritetimeout();
7596
0266434d7df1 net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents: 7595
diff changeset
   529
		self.write, self.send = noop, noop; -- No more writing
10420
6af8c812a885 net.server_epoll: Clarify a debug message
Kim Alvefur <zash@zash.se>
parents: 10336
diff changeset
   530
		self:debug("Close after writing remaining buffered data");
8011
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8010
diff changeset
   531
		self.ondrain = interface.close;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   532
	else
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   533
		self:debug("Closing now");
7596
0266434d7df1 net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents: 7595
diff changeset
   534
		self.write, self.send = noop, noop;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   535
		self.close = noop;
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   536
		self:on("disconnect");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   537
		self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   538
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   539
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   540
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   541
function interface:destroy()
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   542
	self:del();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   543
	self:setwritetimeout(false);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   544
	self:setreadtimeout(false);
7597
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   545
	self.onreadable = noop;
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   546
	self.onwritable = noop;
7597
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   547
	self.destroy = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   548
	self.close = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   549
	self.on = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   550
	self.conn:close();
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   551
	self.conn = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   552
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   553
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   554
function interface:ssl()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   555
	return self._tls;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   556
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   557
11599
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11596
diff changeset
   558
function interface:set_sslctx(sslctx)
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11596
diff changeset
   559
	self._sslctx = sslctx;
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11596
diff changeset
   560
end
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11596
diff changeset
   561
9303
1df8832bd29e net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   562
function interface:starttls(tls_ctx)
1df8832bd29e net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   563
	if tls_ctx then self.tls_ctx = tls_ctx; end
9433
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   564
	self.starttls = false;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   565
	if self.writebuffer and self.writebuffer[1] then
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   566
		self:debug("Start TLS after write");
8011
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8010
diff changeset
   567
		self.ondrain = interface.starttls;
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   568
		self:set(nil, true); -- make sure wantwrite is set
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   569
	else
9433
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   570
		if self.ondrain == interface.starttls then
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   571
			self.ondrain = nil;
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   572
		end
11676
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   573
		self.onwritable = interface.inittls;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   574
		self.onreadable = interface.inittls;
9433
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   575
		self:set(true, true);
11663
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11662
diff changeset
   576
		self:setreadtimeout(cfg.ssl_handshake_timeout);
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11662
diff changeset
   577
		self:setwritetimeout(cfg.ssl_handshake_timeout);
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   578
		self:debug("Prepared to start TLS");
9433
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   579
	end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   580
end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   581
11680
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11679
diff changeset
   582
function interface:inittls(tls_ctx, now)
11676
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   583
	if self._tls then return end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   584
	if tls_ctx then self.tls_ctx = tls_ctx; end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   585
	self._tls = true;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   586
	self:debug("Starting TLS now");
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   587
	self:updatenames(); -- Can't getpeer/sockname after wrap()
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   588
	local ok, conn, err = pcall(luasec.wrap, self.conn, self.tls_ctx);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   589
	if not ok then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   590
		conn, err = ok, conn;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   591
		self:debug("Failed to initialize TLS: %s", err);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   592
	end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   593
	if not conn then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   594
		self:on("disconnect", err);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   595
		self:destroy();
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   596
		return conn, err;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   597
	end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   598
	conn:settimeout(0);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   599
	self.conn = conn;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   600
	if conn.sni then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   601
		if self.servername then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   602
			conn:sni(self.servername);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   603
		elseif self._server and type(self._server.hosts) == "table" and next(self._server.hosts) ~= nil then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   604
			conn:sni(self._server.hosts, true);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   605
		end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   606
	end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   607
	if self.extra and self.extra.tlsa and conn.settlsa then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   608
		-- TODO Error handling
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   609
		if not conn:setdane(self.servername or self.extra.dane_hostname) then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   610
			self:debug("Could not enable DANE on connection");
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   611
		else
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   612
			self:debug("Enabling DANE with %d TLSA records", #self.extra.tlsa);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   613
			self:noise("DANE hostname is %q", self.servername or self.extra.dane_hostname);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   614
			for _, tlsa in ipairs(self.extra.tlsa) do
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   615
				self:noise("TLSA: %q", tlsa);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   616
				conn:settlsa(tlsa.use, tlsa.select, tlsa.match, tlsa.data);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   617
			end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   618
		end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   619
	end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   620
	self:on("starttls");
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   621
	self.ondrain = nil;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   622
	self.onwritable = interface.tlshandshake;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   623
	self.onreadable = interface.tlshandshake;
11680
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11679
diff changeset
   624
	if now then
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11679
diff changeset
   625
		return self:tlshandshake()
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11679
diff changeset
   626
	end
11678
8253f6a30afc net.server_epoll: Use TLS handshake timeout after initiating handshake
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
   627
	self:setreadtimeout(cfg.ssl_handshake_timeout);
8253f6a30afc net.server_epoll: Use TLS handshake timeout after initiating handshake
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
   628
	self:setwritetimeout(cfg.ssl_handshake_timeout);
11679
139d80774f11 net.server_epoll: Keep socket registered in epoll trough TLS wrapping
Kim Alvefur <zash@zash.se>
parents: 11678
diff changeset
   629
	self:set(true, true);
11676
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   630
end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   631
10851
42c8dce6e765 net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents: 10850
diff changeset
   632
function interface:tlshandshake()
9433
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   633
	self:setwritetimeout(false);
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   634
	self:setreadtimeout(false);
10850
d0b098d0f6c3 net.server_epoll: Log some noise before TLS handshake step
Kim Alvefur <zash@zash.se>
parents: 10687
diff changeset
   635
	self:noise("Continuing TLS handshake");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   636
	local ok, err = self.conn:dohandshake();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   637
	if ok then
10313
2a31571efce0 net.server_epoll: Guard against nil return from TLS info method
Kim Alvefur <zash@zash.se>
parents: 10311
diff changeset
   638
		local info = self.conn.info and self.conn:info();
2a31571efce0 net.server_epoll: Guard against nil return from TLS info method
Kim Alvefur <zash@zash.se>
parents: 10311
diff changeset
   639
		if type(info) == "table" then
10311
6a997f0ceba8 net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents: 10309
diff changeset
   640
			self:debug("TLS handshake complete (%s with %s)", info.protocol, info.cipher);
6a997f0ceba8 net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents: 10309
diff changeset
   641
		else
6a997f0ceba8 net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents: 10309
diff changeset
   642
			self:debug("TLS handshake complete");
6a997f0ceba8 net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents: 10309
diff changeset
   643
		end
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   644
		self.onwritable = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   645
		self.onreadable = nil;
8011
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8010
diff changeset
   646
		self:on("status", "ssl-handshake-complete");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   647
		self:set(true, true);
11681
98bcc19361db net.server_epoll: Call onconnect immediately after TLS handshake completion
Kim Alvefur <zash@zash.se>
parents: 11680
diff changeset
   648
		self:onconnect();
98bcc19361db net.server_epoll: Call onconnect immediately after TLS handshake completion
Kim Alvefur <zash@zash.se>
parents: 11680
diff changeset
   649
		self:onreadable();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   650
	elseif err == "wantread" then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   651
		self:noise("TLS handshake to wait until readable");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   652
		self:set(true, false);
9826
13c2707d2417 net.server_epoll: Rename handshake_timeout to ssl_handshake_timeout (fixes #1319)
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
   653
		self:setreadtimeout(cfg.ssl_handshake_timeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   654
	elseif err == "wantwrite" then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   655
		self:noise("TLS handshake to wait until writable");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   656
		self:set(false, true);
9826
13c2707d2417 net.server_epoll: Rename handshake_timeout to ssl_handshake_timeout (fixes #1319)
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
   657
		self:setwritetimeout(cfg.ssl_handshake_timeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   658
	else
10653
228277be4a28 net.server_epoll: Reduce log level of TLS handshake errors to debug
Kim Alvefur <zash@zash.se>
parents: 10642
diff changeset
   659
		self:debug("TLS handshake error: %s", err);
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   660
		self:on("disconnect", err);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   661
		self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   662
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   663
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   664
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   665
local function wrapsocket(client, server, read_size, listeners, tls_ctx, extra) -- luasocket object -> interface object
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   666
	client:settimeout(0);
10283
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10282
diff changeset
   667
	local conn_id = ("conn%s"):format(new_id());
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   668
	local conn = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   669
		conn = client;
8274
c09deab9989e net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents: 8094
diff changeset
   670
		_server = server;
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   671
		created = realtime();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   672
		listeners = listeners;
9313
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9312
diff changeset
   673
		read_size = read_size or (server and server.read_size);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   674
		writebuffer = {};
9435
2e3f66475cc8 net.server_epoll: Inherit Direct TLS flag from servers to their clients
Kim Alvefur <zash@zash.se>
parents: 9434
diff changeset
   675
		tls_ctx = tls_ctx or (server and server.tls_ctx);
2e3f66475cc8 net.server_epoll: Inherit Direct TLS flag from servers to their clients
Kim Alvefur <zash@zash.se>
parents: 9434
diff changeset
   676
		tls_direct = server and server.tls_direct;
10283
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10282
diff changeset
   677
		id = conn_id;
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10282
diff changeset
   678
		log = logger.init(conn_id);
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   679
		extra = extra;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   680
	}, interface_mt);
7594
138f16eb39fb net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
   681
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   682
	if extra then
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   683
		if extra.servername then
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   684
			conn.servername = extra.servername;
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   685
		end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   686
	end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   687
9386
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   688
	conn:updatenames();
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   689
	return conn;
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   690
end
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   691
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   692
function interface:updatenames()
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   693
	local conn = self.conn;
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   694
	local ok, peername, peerport = pcall(conn.getpeername, conn);
10334
d86b1304451a net.server_epoll: Handle getpeer/sockname returning a normal error
Kim Alvefur <zash@zash.se>
parents: 10333
diff changeset
   695
	if ok and peername then
10858
472fe13a05f9 net.server_epoll: Handle missing ports from getsock/peername (as in the case of unix sockets)
Matthew Wild <mwild1@gmail.com>
parents: 10851
diff changeset
   696
		self.peername, self.peerport = peername, peerport or 0;
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   697
	end
9386
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   698
	local ok, sockname, sockport = pcall(conn.getsockname, conn);
10334
d86b1304451a net.server_epoll: Handle getpeer/sockname returning a normal error
Kim Alvefur <zash@zash.se>
parents: 10333
diff changeset
   699
	if ok and sockname then
10858
472fe13a05f9 net.server_epoll: Handle missing ports from getsock/peername (as in the case of unix sockets)
Matthew Wild <mwild1@gmail.com>
parents: 10851
diff changeset
   700
		self.sockname, self.sockport = sockname, sockport or 0;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   701
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   702
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   703
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   704
-- A server interface has new incoming connections waiting
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   705
-- This replaces the onreadable callback
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   706
function interface:onacceptable()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   707
	local conn, err = self.conn:accept();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   708
	if not conn then
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   709
		self:debug("Error accepting new client: %s, server will be paused for %ds", err, cfg.accept_retry_interval);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   710
		self:pausefor(cfg.accept_retry_interval);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   711
		return;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   712
	end
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   713
	local client = wrapsocket(conn, self, nil, self.listeners);
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   714
	client:debug("New connection %s on server %s", client, self);
11690
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11689
diff changeset
   715
	client:defaultoptions();
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   716
	if self.tls_direct then
11663
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11662
diff changeset
   717
		client:add(true, true);
11680
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11679
diff changeset
   718
		client:inittls(self.tls_ctx, true);
9699
5ec4eaf76de8 net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents: 9670
diff changeset
   719
	else
11663
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11662
diff changeset
   720
		client:add(true, false);
9699
5ec4eaf76de8 net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents: 9670
diff changeset
   721
		client:onconnect();
11664
68f0196ece2a net.server_epoll: Immediately attempt to read from newly accepted connections
Kim Alvefur <zash@zash.se>
parents: 11663
diff changeset
   722
		client:onreadable();
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   723
	end
7600
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   724
end
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   725
11663
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11662
diff changeset
   726
-- Initialization for outgoing connections
7600
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   727
function interface:init()
9828
729de68f0068 net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents: 9827
diff changeset
   728
	self:setwritetimeout(cfg.connect_timeout);
11690
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11689
diff changeset
   729
	self:defaultoptions();
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   730
	return self:add(true, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   731
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   732
11690
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11689
diff changeset
   733
function interface:defaultoptions()
11691
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
   734
	if cfg.tcp_keepalive then
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
   735
		self:setoption("keepalive", true);
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
   736
	end
11690
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11689
diff changeset
   737
end
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11689
diff changeset
   738
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   739
function interface:pause()
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   740
	self:noise("Pause reading");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   741
	return self:set(false);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   742
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   743
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   744
function interface:resume()
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   745
	self:noise("Resume reading");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   746
	return self:set(true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   747
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   748
7627
23fb3a084956 net.server_epoll: Comments
Kim Alvefur <zash@zash.se>
parents: 7626
diff changeset
   749
-- Pause connection for some time
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   750
function interface:pausefor(t)
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   751
	self:noise("Pause for %fs", t);
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   752
	if self._pausefor then
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   753
		closetimer(self._pausefor);
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   754
		self._pausefor = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   755
	end
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   756
	if t == false then return; end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   757
	self:set(false);
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   758
	self._pausefor = addtimer(t, function ()
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   759
		self._pausefor = nil;
9998
524b8cd76780 net.server_epoll: Restore wantread flag after pause (fixes #1354)
Kim Alvefur <zash@zash.se>
parents: 9936
diff changeset
   760
		self:set(true);
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   761
		self:noise("Resuming after pause, connection is %s", not self.conn and "missing" or self.conn:dirty() and "dirty" or "clean");
7710
7bb1cc7278b6 net.server_epoll: Make sure socket exists before checking if there is buffered data in it
Kim Alvefur <zash@zash.se>
parents: 7694
diff changeset
   762
		if self.conn and self.conn:dirty() then
7563
785fa1138293 net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents: 7562
diff changeset
   763
			self:onreadable();
785fa1138293 net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents: 7562
diff changeset
   764
		end
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   765
	end);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   766
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   767
10102
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   768
function interface:setlimit(Bps)
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   769
	if Bps > 0 then
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   770
		self._limit = 1/Bps;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   771
	else
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   772
		self._limit = nil;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   773
	end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   774
end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   775
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   776
function interface:pause_writes()
10304
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10293
diff changeset
   777
	if self._write_lock then
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10293
diff changeset
   778
		return
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10293
diff changeset
   779
	end
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   780
	self:noise("Pause writes");
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   781
	self._write_lock = true;
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   782
	self:setwritetimeout(false);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   783
	self:set(nil, false);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   784
end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   785
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   786
function interface:resume_writes()
10304
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10293
diff changeset
   787
	if not self._write_lock then
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10293
diff changeset
   788
		return
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10293
diff changeset
   789
	end
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   790
	self:noise("Resume writes");
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   791
	self._write_lock = nil;
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   792
	if self.writebuffer[1] then
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   793
		self:setwritetimeout();
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   794
		self:set(nil, true);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   795
	end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   796
end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   797
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   798
-- Connected!
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   799
function interface:onconnect()
10642
92918212ee83 net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents: 10593
diff changeset
   800
	self._connected = true;
9597
dcf466e04f81 net.server_epoll: Use method to update peername on connect
Kim Alvefur <zash@zash.se>
parents: 9590
diff changeset
   801
	self:updatenames();
10335
76bd77ad6a2a server_epoll: Log full string represestation when connected
Kim Alvefur <zash@zash.se>
parents: 10334
diff changeset
   802
	self:debug("Connected (%s)", self);
8543
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   803
	self.onconnect = noop;
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   804
	self:on("connect");
8509
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8274
diff changeset
   805
end
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8274
diff changeset
   806
10865
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10858
diff changeset
   807
local function wrapserver(conn, addr, port, listeners, config)
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   808
	local server = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   809
		conn = conn;
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   810
		created = realtime();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   811
		listeners = listeners;
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   812
		read_size = config and config.read_size;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   813
		onreadable = interface.onacceptable;
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   814
		tls_ctx = config and config.tls_ctx;
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   815
		tls_direct = config and config.tls_direct;
9851
adc0672b700e net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   816
		hosts = config and config.sni_hosts;
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   817
		sockname = addr;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   818
		sockport = port;
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   819
		log = logger.init(("serv%s"):format(new_id()));
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   820
	}, interface_mt);
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   821
	server:debug("Server %s created", server);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   822
	server:add(true, false);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   823
	return server;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   824
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   825
10865
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10858
diff changeset
   826
local function listen(addr, port, listeners, config)
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   827
	local conn, err = socket.bind(addr, port, cfg.tcp_backlog);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   828
	if not conn then return conn, err; end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   829
	conn:settimeout(0);
10865
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10858
diff changeset
   830
	return wrapserver(conn, addr, port, listeners, config);
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10858
diff changeset
   831
end
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10858
diff changeset
   832
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   833
-- COMPAT
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   834
local function addserver(addr, port, listeners, read_size, tls_ctx)
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   835
	return listen(addr, port, listeners, {
9313
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9312
diff changeset
   836
		read_size = read_size;
9303
1df8832bd29e net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   837
		tls_ctx = tls_ctx;
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   838
		tls_direct = tls_ctx and true or false;
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   839
	});
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   840
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   841
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   842
-- COMPAT
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   843
local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx, extra)
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   844
	local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra);
7600
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   845
	if not client.peername then
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   846
		client.peername, client.peerport = addr, port;
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   847
	end
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   848
	local ok, err = client:init();
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   849
	if not ok then return ok, err; end
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   850
	if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   851
		client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   852
	end
7554
838212918f11 net.server_epoll: Rename arguments and varibles for consistensy
Kim Alvefur <zash@zash.se>
parents: 7553
diff changeset
   853
	return client;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   854
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   855
7803
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7802
diff changeset
   856
-- New outgoing TCP connection
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   857
local function addclient(addr, port, listeners, read_size, tls_ctx, typ, extra)
9500
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   858
	local create;
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   859
	if not typ then
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   860
		local n = inet_pton(addr);
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   861
		if not n then return nil, "invalid-ip"; end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   862
		if #n == 16 then
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   863
			typ = "tcp6";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   864
		else
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   865
			typ = "tcp4";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   866
		end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   867
	end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   868
	if typ then
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   869
		create = socket[typ];
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   870
	end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   871
	if type(create) ~= "function" then
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   872
		return nil, "invalid socket type";
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   873
	end
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   874
	local conn, err = create();
10086
1df53ef1f60d net.server_epoll: Return errors from creating sockets
Kim Alvefur <zash@zash.se>
parents: 10085
diff changeset
   875
	if not conn then return conn, err; end
9501
cc593002f2e2 net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents: 9500
diff changeset
   876
	local ok, err = conn:settimeout(0);
cc593002f2e2 net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents: 9500
diff changeset
   877
	if not ok then return ok, err; end
9502
36e379f058c8 net.server: Swich method for connecting sockets with remotes
Kim Alvefur <zash@zash.se>
parents: 9501
diff changeset
   878
	local ok, err = conn:setpeername(addr, port);
9501
cc593002f2e2 net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents: 9500
diff changeset
   879
	if not ok and err ~= "timeout" then return ok, err; end
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   880
	local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra)
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   881
	local ok, err = client:init();
10336
e05ea8223b32 net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents: 10335
diff changeset
   882
	if not client.peername then
e05ea8223b32 net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents: 10335
diff changeset
   883
		-- otherwise not set until connected
e05ea8223b32 net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents: 10335
diff changeset
   884
		client.peername, client.peerport = addr, port;
e05ea8223b32 net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents: 10335
diff changeset
   885
	end
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   886
	if not ok then return ok, err; end
10332
5c2b31c823b9 net.server_epoll: Move a log message to improve ordering
Kim Alvefur <zash@zash.se>
parents: 10313
diff changeset
   887
	client:debug("Client %s created", client);
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   888
	if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   889
		client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   890
	end
7559
1f777b38b66c net.server_epoll: Make addclient conform to API (expected by net.http.request)
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
   891
	return client, conn;
7556
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7555
diff changeset
   892
end
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7555
diff changeset
   893
9322
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9317
diff changeset
   894
local function watchfd(fd, onreadable, onwritable)
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   895
	local conn = setmetatable({
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   896
		conn = fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   897
		onreadable = onreadable;
9322
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9317
diff changeset
   898
		onwritable = onwritable;
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   899
		close = function (self)
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   900
			self:del();
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   901
		end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   902
	}, interface_mt);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   903
	if type(fd) == "number" then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   904
		conn.getfd = function ()
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   905
			return fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   906
		end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   907
		-- Otherwise it'll need to be something LuaSocket-compatible
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   908
	end
10424
49a828819696 net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents: 10423
diff changeset
   909
	conn.id = new_id();
49a828819696 net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents: 10423
diff changeset
   910
	conn.log = logger.init(("fdwatch%s"):format(conn.id));
9322
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9317
diff changeset
   911
	conn:add(onreadable, onwritable);
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   912
	return conn;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   913
end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   914
7803
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7802
diff changeset
   915
-- Dump all data from one connection into another
10287
dff360d00dfa net.server_epoll: Handle read size argument to link
Kim Alvefur <zash@zash.se>
parents: 10286
diff changeset
   916
local function link(from, to, read_size)
10284
6b8b255f1d10 net.server_epoll: Add debug logging for various connection events
Kim Alvefur <zash@zash.se>
parents: 10283
diff changeset
   917
	from:debug("Linking to %s", to.id);
10288
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
   918
	function from:onincoming(data)
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
   919
		self:pause();
10293
8c59b20f71dc net.server_epoll: Correct indentation
Kim Alvefur <zash@zash.se>
parents: 10289
diff changeset
   920
		to:write(data);
10288
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
   921
	end
10289
bcf61e22f841 net.server_epoll: Ignore unused self argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10288
diff changeset
   922
	function to:ondrain() -- luacheck: ignore 212/self
10293
8c59b20f71dc net.server_epoll: Correct indentation
Kim Alvefur <zash@zash.se>
parents: 10289
diff changeset
   923
		from:resume();
10288
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
   924
	end
10287
dff360d00dfa net.server_epoll: Handle read size argument to link
Kim Alvefur <zash@zash.se>
parents: 10286
diff changeset
   925
	from:set_mode(read_size);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   926
	from:set(true, nil);
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   927
	to:set(nil, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   928
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   929
9441
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9435
diff changeset
   930
-- COMPAT
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9435
diff changeset
   931
-- net.adns calls this but then replaces :send so this can be a noop
9442
988392a56495 net.server_epoll: Fix luacheck annotation
Kim Alvefur <zash@zash.se>
parents: 9441
diff changeset
   932
function interface:set_send(new_send) -- luacheck: ignore 212
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   933
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   934
7803
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7802
diff changeset
   935
-- Close all connections and servers
7797
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   936
local function closeall()
7802
93643a61858a server_epoll: Ignore unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7800
diff changeset
   937
	for fd, conn in pairs(fds) do -- luacheck: ignore 213/fd
7797
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   938
		conn:close();
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   939
	end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   940
end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   941
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   942
local quitting = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   943
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   944
-- Signal main loop about shutdown via above upvalue
7799
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   945
local function setquitting(quit)
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   946
	if quit then
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   947
		quitting = "quitting";
7800
d0c32d86724f server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents: 7799
diff changeset
   948
		closeall();
7799
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   949
	else
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   950
		quitting = nil;
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   951
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   952
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   953
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   954
-- Main loop
7798
03081bd5c5bb net.server_epoll: Add the 'once' argument to loop for parity with server_select
Kim Alvefur <zash@zash.se>
parents: 7797
diff changeset
   955
local function loop(once)
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   956
	repeat
7661
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7660
diff changeset
   957
		local t = runtimers(cfg.max_wait, cfg.min_wait);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   958
		local fd, r, w = poll:wait(t);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   959
		if fd then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   960
			local conn = fds[fd];
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   961
			if conn then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   962
				if r then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   963
					conn:onreadable();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   964
				end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   965
				if w then
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   966
					conn:onwritable();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   967
				end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   968
			else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   969
				log("debug", "Removing unknown fd %d", fd);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   970
				poll:del(fd);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   971
			end
9511
2055b497b515 net.server_epoll: Special handling of signal interrupts
Kim Alvefur <zash@zash.se>
parents: 9510
diff changeset
   972
		elseif r ~= "timeout" and r ~= "signal" then
9448
af7eafe82447 net.server_epoll: Log error number from wait()
Kim Alvefur <zash@zash.se>
parents: 9444
diff changeset
   973
			log("debug", "epoll_wait error: %s[%d]", r, w);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   974
		end
7800
d0c32d86724f server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents: 7799
diff changeset
   975
	until once or (quitting and next(fds) == nil);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   976
	return quitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   977
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   978
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   979
return {
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   980
	get_backend = function () return "epoll"; end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   981
	addserver = addserver;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   982
	addclient = addclient;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   983
	add_task = addtimer;
10987
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   984
	timer = {
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   985
		-- API-compatible with util.timer
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   986
		add_task = addtimer;
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   987
		stop = closetimer;
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   988
		reschedule = reschedule;
10991
62355b801772 net.server_epoll: Expose way to turn monotonic time into wall clock time
Kim Alvefur <zash@zash.se>
parents: 10989
diff changeset
   989
		to_absolute_time = function (t)
62355b801772 net.server_epoll: Expose way to turn monotonic time into wall clock time
Kim Alvefur <zash@zash.se>
parents: 10989
diff changeset
   990
			return t-monotonic()+realtime();
62355b801772 net.server_epoll: Expose way to turn monotonic time into wall clock time
Kim Alvefur <zash@zash.se>
parents: 10989
diff changeset
   991
		end;
10987
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   992
	};
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   993
	listen = listen;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   994
	loop = loop;
7797
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   995
	closeall = closeall;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   996
	setquitting = setquitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   997
	wrapclient = wrapclient;
10865
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10858
diff changeset
   998
	wrapserver = wrapserver;
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   999
	watchfd = watchfd;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1000
	link = link;
7660
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
  1001
	set_config = function (newconfig)
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
  1002
		cfg = setmetatable(newconfig, default_config);
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
  1003
	end;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1004
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1005
	-- libevent emulation
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1006
	event = { EV_READ = "r", EV_WRITE = "w", EV_READWRITE = "rw", EV_LEAVE = -1 };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1007
	addevent = function (fd, mode, callback)
10092
97da8452c6a6 net.server_epoll: Deprecate libevent emulation layer
Kim Alvefur <zash@zash.se>
parents: 10086
diff changeset
  1008
		log("warn", "Using deprecated libevent emulation, please update code to use watchfd API instead");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1009
		local function onevent(self)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1010
			local ret = self:callback();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1011
			if ret == -1 then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1012
				self:set(false, false);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1013
			elseif ret then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1014
				self:set(mode == "r" or mode == "rw", mode == "w" or mode == "rw");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1015
			end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1016
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1017
7820
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
  1018
		local conn = setmetatable({
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
  1019
			getfd = function () return fd; end;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1020
			callback = callback;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1021
			onreadable = onevent;
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
  1022
			onwritable = onevent;
7820
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
  1023
			close = function (self)
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1024
				self:del();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1025
				fds[fd] = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1026
			end;
7820
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
  1027
		}, interface_mt);
10424
49a828819696 net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents: 10423
diff changeset
  1028
		conn.id = conn:getfd();
49a828819696 net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents: 10423
diff changeset
  1029
		conn.log = logger.init(("fdwatch%d"):format(conn.id));
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1030
		local ok, err = conn:add(mode == "r" or mode == "rw", mode == "w" or mode == "rw");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1031
		if not ok then return ok, err; end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1032
		return conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1033
	end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1034
};