net/server_epoll.lua
author Kim Alvefur <zash@zash.se>
Sun, 24 Mar 2024 20:39:42 +0100
changeset 13466 720aed1f5cf2
parent 13454 f36e1e1b84fe
child 13494 6f840763fc73
permissions -rw-r--r--
util.startup: Check root after detecting platform and reading config (thanks SigmaTel71) Ensures that startup.detect_platform() runs so know whether to use the POSIX method of checking the current user or something else. Also after reading the config so we know whether the root override setting is set.
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;
12978
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    18
local logger = require "prosody.util.logger";
10093
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";
12978
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    21
local realtime = require "prosody.util.time".now;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    22
local monotonic = require "prosody.util.time".monotonic;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    23
local indexedbheap = require "prosody.util.indexedbheap";
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    24
local createtable = require "prosody.util.table".create;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    25
local inet = require "prosody.util.net";
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_pton = inet.pton;
7740
f93b3083b46b net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents: 7710
diff changeset
    27
local _SOCKETINVALID = socket._SOCKETINVALID or -1;
12978
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    28
local new_id = require "prosody.util.id".short;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    29
local xpcall = require "prosody.util.xpcall".xpcall;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    30
local sslconfig = require "prosody.util.sslconfig";
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    31
local tls_impl = require "prosody.net.tls_luasec";
13444
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
    32
local have_signal, signal = pcall(require, "prosody.util.signal");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
12978
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12832
diff changeset
    34
local poller = require "prosody.util.poll"
9509
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
    35
local EEXIST = poller.EEXIST;
9510
33d21f020b66 net.server_epoll: Ignore ENOENT when deregitering socket
Kim Alvefur <zash@zash.se>
parents: 9509
diff changeset
    36
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
    37
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
    38
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
    39
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8555
diff changeset
    41
-- luacheck: std none
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
7660
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
    43
local default_config = { __index = {
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    44
	-- 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
    45
	read_timeout = 14 * 60;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    46
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    47
	-- 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
    48
	send_timeout = 180;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    49
9828
729de68f0068 net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents: 9827
diff changeset
    50
	-- 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
    51
	connect_timeout = 20;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    52
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    53
	-- 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
    54
	tcp_backlog = 128;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    55
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    56
	-- 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
    57
	accept_retry_interval = 10;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    58
11675
4e4e26e3df8d net.server_epoll: Fix typo
Kim Alvefur <zash@zash.se>
parents: 11669
diff changeset
    59
	-- 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
    60
	read_retry_delay = 1e-06;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    61
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    62
	-- 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
    63
	read_size = 8192;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    64
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    65
	-- 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
    66
	ssl_handshake_timeout = 60;
9669
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    67
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    68
	-- 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
    69
	max_wait = 86400;
11698
d6be4dda1f60 net.server_epoll: Set minimum wait time to 1ms, matching epoll
Kim Alvefur <zash@zash.se>
parents: 11693
diff changeset
    70
	min_wait = 0.001;
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
    71
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
    72
	-- Enable extra noisy debug logging
12346
cba0b93320b7 net.server_epoll: Disable verbose mode by default
Kim Alvefur <zash@zash.se>
parents: 12114
diff changeset
    73
	verbose = false;
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
    74
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
    75
	-- 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
    76
	-- 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
    77
	fatal_errors = false;
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
    78
10996
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
    79
	-- 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
    80
	protect_listeners = true;
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
    81
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
    82
	-- Attempt writes instantly
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
    83
	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
    84
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
    85
	-- TCP Keepalives
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
    86
	tcp_keepalive = false; -- boolean | number
11693
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11692
diff changeset
    87
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11692
diff changeset
    88
	-- Whether to let the Nagle algorithm stay enabled
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11692
diff changeset
    89
	nagle = true;
11700
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11699
diff changeset
    90
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11699
diff changeset
    91
	-- Reuse write buffer tables
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11699
diff changeset
    92
	keep_buffers = true;
11815
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
    93
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
    94
	--- How long to wait after getting the shutdown signal before forcefully tearing down every socket
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
    95
	shutdown_deadline = 5;
12516
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12485
diff changeset
    96
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12485
diff changeset
    97
	-- TCP Fast Open
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12485
diff changeset
    98
	tcp_fastopen = false;
12519
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12518
diff changeset
    99
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12518
diff changeset
   100
	-- Defer accept until incoming data is available
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12518
diff changeset
   101
	tcp_defer_accept = false;
7660
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
   102
}};
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
   103
local cfg = default_config.__index;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   104
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   105
local fds = createtable(10, 0); -- FD -> conn
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   106
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   107
-- Timer and scheduling --
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   108
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   109
local timers = indexedbheap.create();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   110
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   111
local function noop() end
11765
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   112
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   113
-- Keep track of recently closed timers to avoid re-adding them
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   114
local closedtimers = {};
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   115
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   116
local function closetimer(id)
11765
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   117
	if timers:remove(id) then
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   118
		closedtimers[id] = true;
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   119
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   120
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   121
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   122
local function reschedule(id, time)
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   123
	time = monotonic() + time;
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   124
	timers:reprioritize(id, time);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   125
end
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   126
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   127
-- Add relative timer
10986
276f16101d59 net.server_epoll: Make API-compatible with util.timer
Kim Alvefur <zash@zash.se>
parents: 10865
diff changeset
   128
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
   129
	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
   130
	if param ~= nil then
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   131
		local timer_callback = f
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   132
		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
   133
			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
   134
			return t;
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   135
		end
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   136
	end
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   137
	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
   138
	return id;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   139
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   140
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   141
-- Run callbacks of expired timers
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   142
-- 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
   143
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
   144
	-- Any timers at all?
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   145
	local elapsed = monotonic();
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   146
	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
   147
	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
   148
	local readd;
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   149
	while peek do
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   150
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   151
		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
   152
			break;
10685
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10063
diff changeset
   153
		end
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   154
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   155
		local _, timer, id = timers:pop();
10994
03e76ad725b2 net.server_epoll: ... and include a traceback
Kim Alvefur <zash@zash.se>
parents: 10993
diff changeset
   156
		local ok, ret = xpcall(timer, traceback, now, id);
11765
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   157
		if ok and type(ret) == "number" and not closedtimers[id] then
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   158
			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
   159
			-- 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
   160
			-- 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
   161
			if readd then
11268
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11243 11266
diff changeset
   162
				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
   163
			else
11268
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11243 11266
diff changeset
   164
				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
   165
			end
10993
b824fe9d0c8b net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
   166
		elseif not ok then
b824fe9d0c8b net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
   167
			log("error", "Error in timer: %s", ret);
10685
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10063
diff changeset
   168
		end
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   169
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   170
		peek = timers:peek();
10685
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10063
diff changeset
   171
	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
   172
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   173
	if readd then
11755
a8c9a78c6a4b net.server_epoll: Fix to preserve ids of readded timers
Kim Alvefur <zash@zash.se>
parents: 11269
diff changeset
   174
		for id, timer in pairs(readd) do
11756
6427e2642976 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11747 11755
diff changeset
   175
			timers:insert(timer[1], timer[2], id);
11266
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   176
		end
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   177
		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
   178
	end
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11067
diff changeset
   179
11765
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   180
	if next(closedtimers) ~= nil then
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   181
		closedtimers = {};
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   182
	end
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11756
diff changeset
   183
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   184
	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
   185
		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
   186
	else
11268
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11243 11266
diff changeset
   187
		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
   188
	end
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7631
diff changeset
   189
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   190
	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
   191
		return min_wait;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   192
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   193
	return next_delay;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   194
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   195
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   196
-- Socket handler interface
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   197
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   198
local interface = {};
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   199
local interface_mt = { __index = interface };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   200
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   201
function interface_mt:__tostring()
7588
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7587
diff changeset
   202
	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
   203
		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
   204
	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
   205
		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
   206
	end
9324
146dc1e4c7ff net.server_epoll: Simplify minimal string representation
Kim Alvefur <zash@zash.se>
parents: 9323
diff changeset
   207
	return ("FD %d"):format(self:getfd());
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   208
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   209
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   210
interface.log = log;
11501
960674938665 net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 11417
diff changeset
   211
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
   212
	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
   213
end
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   214
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   215
interface.noise = interface.debug;
11501
960674938665 net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 11417
diff changeset
   216
function interface:noise(msg, ...)
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   217
	if cfg.verbose then
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   218
		return self:debug(msg, ...);
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   219
	end
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   220
end
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   221
11501
960674938665 net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 11417
diff changeset
   222
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
   223
	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
   224
end
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   225
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   226
-- 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
   227
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
   228
	self:on("detach");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   229
	self.listeners = listeners;
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   230
	self:on("attach", data);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   231
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   232
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   233
-- 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
   234
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
   235
	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
   236
		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
   237
		return;
be374a5778f3 net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents: 7913
diff changeset
   238
	end
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   239
	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
   240
	if not listener then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   241
		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
   242
		return;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   243
	end
10996
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
   244
	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
   245
		return listener(self, ...);
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10995
diff changeset
   246
	end
10995
aa85cb5b859f net.server_epoll: Allow setting a custom error handler for listener
Kim Alvefur <zash@zash.se>
parents: 10994
diff changeset
   247
	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
   248
	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
   249
	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
   250
		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
   251
			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
   252
			self:destroy();
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   253
		else
11243
06a5919e2496 net.server_epoll: Increase log level for error in callback
Kim Alvefur <zash@zash.se>
parents: 11072
diff changeset
   254
			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
   255
		end
10084
39ca4202ae1e net.server_epoll: Return listener error message
Kim Alvefur <zash@zash.se>
parents: 10065
diff changeset
   256
		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
   257
	end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   258
	return err;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   259
end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   260
10282
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   261
-- 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
   262
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
   263
	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
   264
end
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   265
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   266
-- Return the file descriptor number
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   267
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
   268
	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
   269
		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
   270
	end
7740
f93b3083b46b net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents: 7710
diff changeset
   271
	return _SOCKETINVALID;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   272
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   273
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
   274
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
   275
	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
   276
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
   277
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   278
-- Get IP address
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   279
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
   280
	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
   281
end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   282
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   283
-- 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
   284
function interface:port()
11797
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   285
	return self.peerport or self.sockport;
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   286
end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   287
11797
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   288
-- Client-side port (usually a random high port)
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   289
function interface:clientport()
11797
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   290
	if self._server then
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   291
		return self.peerport;
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   292
	else
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   293
		return self.sockport;
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   294
	end
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   295
end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   296
11797
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   297
-- Get port on the server
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   298
function interface:serverport()
11797
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   299
	if self._server then
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   300
		return self.sockport;
11797
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   301
	else
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11765
diff changeset
   302
		return self.peerport;
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   303
	end
7550
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
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   306
-- Return underlying socket
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   307
function interface:socket()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   308
	return self.conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   309
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   310
7913
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7820
diff changeset
   311
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
   312
	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
   313
end
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7820
diff changeset
   314
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   315
function interface:setoption(k, v)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   316
	-- 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
   317
	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
   318
	if not ok then
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   319
		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
   320
		return ok, ret;
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   321
	elseif not ret then
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   322
		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
   323
		return ret, err;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   324
	end
11689
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11681
diff changeset
   325
	return ret;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   326
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   327
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   328
-- Timeout for detecting dead or idle sockets
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   329
function interface:setreadtimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   330
	if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   331
		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
   332
			closetimer(self._readtimeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   333
			self._readtimeout = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   334
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   335
		return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   336
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   337
	t = t or cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   338
	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
   339
		reschedule(self._readtimeout, t);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   340
	else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   341
		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
   342
			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
   343
				self:noise("Read timeout handled");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   344
				return cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   345
			else
10421
d8a0b0d21c81 net.server_epoll: Improve read timeout debug messages
Kim Alvefur <zash@zash.se>
parents: 10420
diff changeset
   346
				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
   347
				self:on("disconnect", "read timeout");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   348
				self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   349
			end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   350
		end);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   351
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   352
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   353
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   354
-- Timeout for detecting dead sockets
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   355
function interface:setwritetimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   356
	if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   357
		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
   358
			closetimer(self._writetimeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   359
			self._writetimeout = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   360
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   361
		return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   362
	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
   363
	t = t or cfg.send_timeout;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   364
	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
   365
		reschedule(self._writetimeout, t);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   366
	else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   367
		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
   368
			self:noise("Write timeout");
10642
92918212ee83 net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents: 10593
diff changeset
   369
			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
   370
			self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   371
		end);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   372
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   373
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   374
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   375
function interface:add(r, w)
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   376
	local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   377
	if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   378
		return nil, "invalid fd";
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   379
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   380
	if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   381
	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
   382
	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
   383
	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
   384
		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
   385
			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
   386
			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
   387
		end
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   388
		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
   389
		return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   390
	end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   391
	self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   392
	fds[fd] = self;
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   393
	self:noise("Registered in poller");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   394
	return true;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   395
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   396
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   397
function interface:set(r, w)
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   398
	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
   399
	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
   400
		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
   401
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   402
	if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   403
	if w == nil then w = self._wantwrite; end
13340
f91761822420 net.server_epoll: Avoid call to update socket watch flags when nothing changed
Kim Alvefur <zash@zash.se>
parents: 12978
diff changeset
   404
	if r  == self._wantread and w == self._wantwrite then
f91761822420 net.server_epoll: Avoid call to update socket watch flags when nothing changed
Kim Alvefur <zash@zash.se>
parents: 12978
diff changeset
   405
		return true
f91761822420 net.server_epoll: Avoid call to update socket watch flags when nothing changed
Kim Alvefur <zash@zash.se>
parents: 12978
diff changeset
   406
	end
9387
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9386
diff changeset
   407
	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
   408
	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
   409
		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
   410
		return ok, err;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   411
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   412
	self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   413
	return true;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   414
end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   415
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   416
function interface:del()
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   417
	local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   418
	if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   419
		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
   420
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   421
	if fds[fd] ~= self then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   422
		return nil, "unregistered fd";
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   423
	end
9387
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9386
diff changeset
   424
	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
   425
	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
   426
		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
   427
		return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   428
	end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   429
	self._wantread, self._wantwrite = nil, nil;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   430
	fds[fd] = nil;
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   431
	self:noise("Unregistered from poller");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   432
	return true;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   433
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   434
9323
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   435
function interface:setflags(r, w)
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   436
	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
   437
		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
   438
			return true; -- no change
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   439
		end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   440
		return self:add(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   441
	end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   442
	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
   443
		return self:del();
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   444
	end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   445
	return self:set(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   446
end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   447
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   448
-- Called when socket is readable
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   449
function interface:onreadable()
9314
9b0604fe01f1 net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents: 9313
diff changeset
   450
	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
   451
	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
   452
		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
   453
		self:onincoming(data);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   454
	else
9935
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   455
		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
   456
			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
   457
			err = "timeout";
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   458
		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
   459
			self:set(nil, true);
11706
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11705
diff changeset
   460
			self:setwritetimeout();
9935
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   461
			err = "timeout";
11596
64cfa396bb84 net.server_epoll: Fix reporting of socket connect timeout
Kim Alvefur <zash@zash.se>
parents: 11501
diff changeset
   462
		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
   463
			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
   464
		end
8543
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   465
		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
   466
			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
   467
			self:onincoming(partial, err);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   468
		end
11818
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11817
diff changeset
   469
		if err == "closed" and self._connected then
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11817
diff changeset
   470
			self:debug("Connection closed by remote");
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11817
diff changeset
   471
			self:close(err);
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11817
diff changeset
   472
			return;
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11817
diff changeset
   473
		elseif err ~= "timeout" then
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11817
diff changeset
   474
			self:debug("Read error, closing (%s)", err);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   475
			self:on("disconnect", err);
11818
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11817
diff changeset
   476
			self:destroy();
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   477
			return;
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   478
		end
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   479
	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
   480
	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
   481
	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
   482
		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
   483
		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
   484
			self:setreadtimeout(false);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   485
			self:pausefor(cost);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   486
			return;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   487
		end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   488
	end
11705
a3572205c5bf net.server_epoll: Skip reset of read timeout when not reading
Kim Alvefur <zash@zash.se>
parents: 11704
diff changeset
   489
	if not self._wantread then return end
a3572205c5bf net.server_epoll: Skip reset of read timeout when not reading
Kim Alvefur <zash@zash.se>
parents: 11704
diff changeset
   490
	if 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
   491
		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
   492
		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
   493
	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
   494
		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
   495
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   496
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   497
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   498
-- Called when socket is writable
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   499
function interface:onwritable()
11924
ff4e34c448a4 net.server_epoll: Try harder to avoid reentrant opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11862
diff changeset
   500
	self._writing = true; -- prevent reentrant writes etc
8555
1fcefc16a55d server_epoll: Onconnect should happen before first attempt to write to socket
Kim Alvefur <zash@zash.se>
parents: 8545
diff changeset
   501
	self:onconnect();
12015
9dc36fdbdba1 net.server_epoll: Ensure calls to :write() return something
Kim Alvefur <zash@zash.se>
parents: 11976
diff changeset
   502
	if not self.conn then return nil, "no-conn"; end -- could have been closed in onconnect
11745
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11742
diff changeset
   503
	self:on("predrain");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   504
	local buffer = self.writebuffer;
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   505
	local data = buffer or "";
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   506
	if type(buffer) == "table" then
11702
9a2a98621c73 net.server_epoll: Optimize concatenation of exactly 2 buffer chunks
Kim Alvefur <zash@zash.se>
parents: 11701
diff changeset
   507
		if buffer[3] then
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   508
			data = t_concat(data);
11702
9a2a98621c73 net.server_epoll: Optimize concatenation of exactly 2 buffer chunks
Kim Alvefur <zash@zash.se>
parents: 11701
diff changeset
   509
		elseif buffer[2] then
9a2a98621c73 net.server_epoll: Optimize concatenation of exactly 2 buffer chunks
Kim Alvefur <zash@zash.se>
parents: 11701
diff changeset
   510
			data = buffer[1] .. buffer[2];
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   511
		else
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   512
			data = buffer[1] or "";
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   513
		end
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   514
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   515
	local ok, err, partial = self.conn:send(data);
11742
3f1450ec37f4 net.server_epoll: Improve efficiency of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
   516
	self._writable = ok;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   517
	if ok then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   518
		self:set(nil, false);
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   519
		if cfg.keep_buffers and type(buffer) == "table" then
11809
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   520
			for i = #buffer, 1, -1 do
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   521
				buffer[i] = nil;
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   522
			end
11700
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11699
diff changeset
   523
		else
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11699
diff changeset
   524
			self.writebuffer = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   525
		end
11926
28f5c8061dad net.server_epoll: Fix streaming downloads (thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 11924
diff changeset
   526
		self._writing = nil;
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
   527
		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
   528
		self:ondrain(); -- Be aware of writes in ondrain
11699
1573099157c9 net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11698
diff changeset
   529
		return ok;
8543
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   530
	elseif partial then
10309
2fadbf209678 net.server_epoll: Log size of partial writes (debug)
Kim Alvefur <zash@zash.se>
parents: 10304
diff changeset
   531
		self:debug("Sent %d out of %d buffered bytes", partial, #data);
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   532
		if cfg.keep_buffers and type(buffer) == "table" then
11809
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   533
			buffer[1] = data:sub(partial+1);
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   534
			for i = #buffer, 2, -1 do
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   535
				buffer[i] = nil;
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   536
			end
11700
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11699
diff changeset
   537
		else
11707
e57c5d9c722c net.server_epoll: Fix traceback-causing typo
Kim Alvefur <zash@zash.se>
parents: 11706
diff changeset
   538
			self.writebuffer = data:sub(partial+1);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   539
		end
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   540
		self:set(nil, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   541
		self:setwritetimeout();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   542
	end
11924
ff4e34c448a4 net.server_epoll: Try harder to avoid reentrant opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11862
diff changeset
   543
	self._writing = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   544
	if err == "wantwrite" or err == "timeout" then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   545
		self:set(nil, true);
11706
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11705
diff changeset
   546
		self:setwritetimeout();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   547
	elseif err == "wantread" then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   548
		self:set(true, nil);
11706
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11705
diff changeset
   549
		self:setreadtimeout();
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   550
	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
   551
		self:on("disconnect", err);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   552
		self:destroy();
11699
1573099157c9 net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11698
diff changeset
   553
		return ok, err;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   554
	end
12015
9dc36fdbdba1 net.server_epoll: Ensure calls to :write() return something
Kim Alvefur <zash@zash.se>
parents: 11976
diff changeset
   555
	return true, err;
7550
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
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   558
-- The write buffer has been successfully emptied
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   559
function interface:ondrain()
8011
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8010
diff changeset
   560
	return self:on("drain");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   561
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   562
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   563
-- 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
   564
function interface:write(data)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   565
	local buffer = self.writebuffer;
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   566
	if type(buffer) == "table" then
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   567
		t_insert(buffer, data);
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   568
	elseif type(buffer) == "string" then
11700
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11699
diff changeset
   569
		self:noise("Allocating buffer!")
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   570
		self.writebuffer = { buffer, data };
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   571
	elseif buffer == nil then
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   572
		self.writebuffer = data;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   573
	end
11924
ff4e34c448a4 net.server_epoll: Try harder to avoid reentrant opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11862
diff changeset
   574
	if not self._write_lock and not self._writing then
11742
3f1450ec37f4 net.server_epoll: Improve efficiency of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
   575
		if self._writable and cfg.opportunistic_writes and not self._opportunistic_write then
11669
148075532021 net.server_epoll: Prevent stack overflow of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11664
diff changeset
   576
			self._opportunistic_write = true;
11699
1573099157c9 net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11698
diff changeset
   577
			local ret, err = self:onwritable();
11669
148075532021 net.server_epoll: Prevent stack overflow of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11664
diff changeset
   578
			self._opportunistic_write = nil;
11699
1573099157c9 net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11698
diff changeset
   579
			return ret, err;
11809
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   580
		end
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   581
		self:setwritetimeout();
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   582
		self:set(nil, true);
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   583
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   584
	return #data;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   585
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   586
interface.send = interface.write;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   587
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   588
-- Close, possibly after writing is done
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   589
function interface:close()
11817
790bffbb9047 net.server_epoll: Skip attempt to flush write buffer when not connected
Kim Alvefur <zash@zash.se>
parents: 11816
diff changeset
   590
	if self._connected and self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then
11976
520ce76440ad net.server_epoll: Prevent loop attempting to send last data after close
Kim Alvefur <zash@zash.se>
parents: 11926
diff changeset
   591
		self._connected = false;
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   592
		self:set(false, true); -- Flush final buffer contents
11706
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11705
diff changeset
   593
		self:setreadtimeout(false);
11662
36942fa001b4 net.server_epoll: Ensure timeout after closing
Kim Alvefur <zash@zash.se>
parents: 11599
diff changeset
   594
		self:setwritetimeout();
7596
0266434d7df1 net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents: 7595
diff changeset
   595
		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
   596
		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
   597
		self.ondrain = interface.close;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   598
	else
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   599
		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
   600
		self.write, self.send = noop, noop;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   601
		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
   602
		self:on("disconnect");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   603
		self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   604
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   605
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   606
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   607
function interface:destroy()
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   608
	self:del();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   609
	self:setwritetimeout(false);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   610
	self:setreadtimeout(false);
7597
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   611
	self.onreadable = noop;
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   612
	self.onwritable = noop;
7597
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   613
	self.destroy = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   614
	self.close = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   615
	self.on = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   616
	self.conn:close();
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   617
	self.conn = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   618
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   619
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   620
function interface:ssl()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   621
	return self._tls;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   622
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   623
11599
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11596
diff changeset
   624
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
   625
	self._sslctx = sslctx;
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11596
diff changeset
   626
end
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11596
diff changeset
   627
12484
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   628
function interface:sslctx()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   629
	return self.tls_ctx
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   630
end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   631
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   632
function interface:ssl_info()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   633
	local sock = self.conn;
13426
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13340
diff changeset
   634
	if not sock then return nil, "not-connected" end
12546
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12519
diff changeset
   635
	if not sock.info then return nil, "not-implemented"; end
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12519
diff changeset
   636
	return sock:info();
12484
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   637
end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   638
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   639
function interface:ssl_peercertificate()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   640
	local sock = self.conn;
13426
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13340
diff changeset
   641
	if not sock then return nil, "not-connected" end
12546
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12519
diff changeset
   642
	if not sock.getpeercertificate then return nil, "not-implemented"; end
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12519
diff changeset
   643
	return sock:getpeercertificate();
12484
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   644
end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   645
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   646
function interface:ssl_peerverification()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   647
	local sock = self.conn;
13426
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13340
diff changeset
   648
	if not sock then return nil, "not-connected" end
12546
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12519
diff changeset
   649
	if not sock.getpeerverification then return nil, { { "Chain verification not supported" } }; end
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12519
diff changeset
   650
	return sock:getpeerverification();
12484
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   651
end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   652
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   653
function interface:ssl_peerfinished()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   654
	local sock = self.conn;
13426
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13340
diff changeset
   655
	if not sock then return nil, "not-connected" end
12546
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12519
diff changeset
   656
	if not sock.getpeerfinished then return nil, "not-implemented"; end
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12519
diff changeset
   657
	return sock:getpeerfinished();
12484
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   658
end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   659
12598
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12546
diff changeset
   660
function interface:ssl_exportkeyingmaterial(label, len, context)
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12546
diff changeset
   661
	local sock = self.conn;
13426
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13340
diff changeset
   662
	if not sock then return nil, "not-connected" end
12598
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12546
diff changeset
   663
	if sock.exportkeyingmaterial then
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12546
diff changeset
   664
		return sock:exportkeyingmaterial(label, len, context);
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12546
diff changeset
   665
	end
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12546
diff changeset
   666
end
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12546
diff changeset
   667
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12546
diff changeset
   668
9303
1df8832bd29e net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   669
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
   670
	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
   671
	self.starttls = false;
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   672
	if self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   673
		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
   674
		self.ondrain = interface.starttls;
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   675
		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
   676
	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
   677
		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
   678
			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
   679
		end
11676
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   680
		self.onwritable = interface.inittls;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   681
		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
   682
		self:set(true, true);
11703
1275dad71afd net.server_epoll: Use only fatal "write" timeout during TLS negotiation
Kim Alvefur <zash@zash.se>
parents: 11702
diff changeset
   683
		self:setreadtimeout(false);
11663
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11662
diff changeset
   684
		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
   685
		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
   686
	end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   687
end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   688
11680
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11679
diff changeset
   689
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
   690
	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
   691
	if tls_ctx then self.tls_ctx = tls_ctx; end
11809
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   692
	self._tls = true;
11843
19b50ce9ef5a net.server_epoll: Prevent starttls on direct TLS connections
Kim Alvefur <zash@zash.se>
parents: 11818
diff changeset
   693
	self.starttls = false;
11676
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   694
	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
   695
	self:updatenames(); -- Can't getpeer/sockname after wrap()
12484
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   696
	local conn, err = self.tls_ctx:wrap(self.conn);
11809
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   697
	if not conn then
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   698
		self:on("disconnect", err);
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   699
		self:destroy();
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   700
		return conn, err;
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   701
	end
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   702
	conn:settimeout(0);
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   703
	self.conn = conn;
11676
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   704
	if conn.sni then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   705
		if self.servername then
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   706
			conn:sni(self.servername);
12484
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   707
		elseif next(self.tls_ctx._sni_contexts) ~= nil then
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12346
diff changeset
   708
			conn:sni(self.tls_ctx._sni_contexts, true);
9434
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9433
diff changeset
   709
		end
11676
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   710
	end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   711
	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
   712
		-- TODO Error handling
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   713
		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
   714
			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
   715
		else
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   716
			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
   717
			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
   718
			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
   719
				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
   720
				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
   721
			end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   722
		end
11809
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   723
	end
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   724
	self:on("starttls");
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
   725
	self.ondrain = nil;
11676
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   726
	self.onwritable = interface.tlshandshake;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   727
	self.onreadable = interface.tlshandshake;
11680
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11679
diff changeset
   728
	if now then
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11679
diff changeset
   729
		return self:tlshandshake()
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   730
	end
11703
1275dad71afd net.server_epoll: Use only fatal "write" timeout during TLS negotiation
Kim Alvefur <zash@zash.se>
parents: 11702
diff changeset
   731
	self:setreadtimeout(false);
11678
8253f6a30afc net.server_epoll: Use TLS handshake timeout after initiating handshake
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
   732
	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
   733
	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
   734
end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
   735
10851
42c8dce6e765 net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents: 10850
diff changeset
   736
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
   737
	self:setreadtimeout(false);
10850
d0b098d0f6c3 net.server_epoll: Log some noise before TLS handshake step
Kim Alvefur <zash@zash.se>
parents: 10687
diff changeset
   738
	self:noise("Continuing TLS handshake");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   739
	local ok, err = self.conn:dohandshake();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   740
	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
   741
		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
   742
		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
   743
			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
   744
		else
6a997f0ceba8 net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents: 10309
diff changeset
   745
			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
   746
		end
11704
79d30de13fdb net.server_epoll: Reduce timer churn during TLS handshake
Kim Alvefur <zash@zash.se>
parents: 11703
diff changeset
   747
		self:setwritetimeout(false);
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   748
		self.onwritable = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   749
		self.onreadable = nil;
8011
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8010
diff changeset
   750
		self:on("status", "ssl-handshake-complete");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   751
		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
   752
		self:onconnect();
98bcc19361db net.server_epoll: Call onconnect immediately after TLS handshake completion
Kim Alvefur <zash@zash.se>
parents: 11680
diff changeset
   753
		self:onreadable();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   754
	elseif err == "wantread" then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   755
		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
   756
		self:set(true, false);
11703
1275dad71afd net.server_epoll: Use only fatal "write" timeout during TLS negotiation
Kim Alvefur <zash@zash.se>
parents: 11702
diff changeset
   757
		self:setwritetimeout(cfg.ssl_handshake_timeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   758
	elseif err == "wantwrite" then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   759
		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
   760
		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
   761
		self:setwritetimeout(cfg.ssl_handshake_timeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   762
	else
10653
228277be4a28 net.server_epoll: Reduce log level of TLS handshake errors to debug
Kim Alvefur <zash@zash.se>
parents: 10642
diff changeset
   763
		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
   764
		self:on("disconnect", err);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   765
		self:destroy();
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
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   768
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   769
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
   770
	client:settimeout(0);
10283
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10282
diff changeset
   771
	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
   772
	local conn = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   773
		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
   774
		_server = server;
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   775
		created = realtime();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   776
		listeners = listeners;
9313
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9312
diff changeset
   777
		read_size = read_size or (server and server.read_size);
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   778
		writebuffer = nil;
9435
2e3f66475cc8 net.server_epoll: Inherit Direct TLS flag from servers to their clients
Kim Alvefur <zash@zash.se>
parents: 9434
diff changeset
   779
		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
   780
		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
   781
		id = conn_id;
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10282
diff changeset
   782
		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
   783
		extra = extra;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   784
	}, interface_mt);
7594
138f16eb39fb net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
   785
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   786
	if extra then
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   787
		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
   788
			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
   789
		end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   790
	end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   791
9386
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   792
	return conn;
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   793
end
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   794
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   795
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
   796
	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
   797
	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
   798
	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
   799
		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
   800
	end
9386
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   801
	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
   802
	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
   803
		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
   804
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   805
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   806
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   807
-- A server interface has new incoming connections waiting
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   808
-- This replaces the onreadable callback
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   809
function interface:onacceptable()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   810
	local conn, err = self.conn:accept();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   811
	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
   812
		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
   813
		self:pausefor(cfg.accept_retry_interval);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   814
		return;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   815
	end
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   816
	local client = wrapsocket(conn, self, nil, self.listeners);
12517
6efbcd52db21 net.server_epoll: Move call to refresh remote IP address out of wrapper
Kim Alvefur <zash@zash.se>
parents: 12516
diff changeset
   817
	client:updatenames();
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   818
	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
   819
	client:defaultoptions();
11742
3f1450ec37f4 net.server_epoll: Improve efficiency of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11707
diff changeset
   820
	client._writable = cfg.opportunistic_writes;
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   821
	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
   822
		client:add(true, true);
11680
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11679
diff changeset
   823
		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
   824
	else
11663
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11662
diff changeset
   825
		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
   826
		client:onconnect();
11664
68f0196ece2a net.server_epoll: Immediately attempt to read from newly accepted connections
Kim Alvefur <zash@zash.se>
parents: 11663
diff changeset
   827
		client:onreadable();
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   828
	end
7600
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   829
end
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   830
11663
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11662
diff changeset
   831
-- Initialization for outgoing connections
7600
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   832
function interface:init()
9828
729de68f0068 net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents: 9827
diff changeset
   833
	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
   834
	self:defaultoptions();
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   835
	return self:add(true, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   836
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   837
11690
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11689
diff changeset
   838
function interface:defaultoptions()
11693
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11692
diff changeset
   839
	if cfg.nagle == false then
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11692
diff changeset
   840
		self:setoption("tcp-nodelay", true);
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11692
diff changeset
   841
	end
11691
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
   842
	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
   843
		self:setoption("keepalive", true);
11692
3fc564f7441b net.server_epoll: Support setting keepalive idle time
Kim Alvefur <zash@zash.se>
parents: 11691
diff changeset
   844
		if type(cfg.tcp_keepalive) == "number" then
3fc564f7441b net.server_epoll: Support setting keepalive idle time
Kim Alvefur <zash@zash.se>
parents: 11691
diff changeset
   845
			self:setoption("tcp-keepidle", cfg.tcp_keepalive);
3fc564f7441b net.server_epoll: Support setting keepalive idle time
Kim Alvefur <zash@zash.se>
parents: 11691
diff changeset
   846
		end
11691
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11690
diff changeset
   847
	end
11690
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11689
diff changeset
   848
end
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11689
diff changeset
   849
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   850
function interface:pause()
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   851
	self:noise("Pause reading");
11706
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11705
diff changeset
   852
	self:setreadtimeout(false);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   853
	return self:set(false);
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
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   856
function interface:resume()
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   857
	self:noise("Resume reading");
11706
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11705
diff changeset
   858
	self:setreadtimeout();
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   859
	return self:set(true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   860
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   861
7627
23fb3a084956 net.server_epoll: Comments
Kim Alvefur <zash@zash.se>
parents: 7626
diff changeset
   862
-- Pause connection for some time
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   863
function interface:pausefor(t)
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   864
	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
   865
	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
   866
		closetimer(self._pausefor);
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   867
		self._pausefor = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   868
	end
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   869
	if t == false then return; end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   870
	self:set(false);
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   871
	self._pausefor = addtimer(t, function ()
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   872
		self._pausefor = nil;
9998
524b8cd76780 net.server_epoll: Restore wantread flag after pause (fixes #1354)
Kim Alvefur <zash@zash.se>
parents: 9936
diff changeset
   873
		self:set(true);
11747
856dada099fa net.server_epoll: Split, attempt to clarify dirty noise message
Kim Alvefur <zash@zash.se>
parents: 11745
diff changeset
   874
		self:noise("Resuming after pause");
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
   875
		if self.conn and self.conn:dirty() then
11747
856dada099fa net.server_epoll: Split, attempt to clarify dirty noise message
Kim Alvefur <zash@zash.se>
parents: 11745
diff changeset
   876
			self:noise("Have buffered incoming data to process");
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
   877
			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
   878
		end
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   879
	end);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   880
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   881
10102
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   882
function interface:setlimit(Bps)
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   883
	if Bps > 0 then
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   884
		self._limit = 1/Bps;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   885
	else
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   886
		self._limit = nil;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   887
	end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   888
end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   889
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   890
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
   891
	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
   892
		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
   893
	end
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   894
	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
   895
	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
   896
	self:setwritetimeout(false);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   897
	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
   898
end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   899
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   900
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
   901
	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
   902
		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
   903
	end
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   904
	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
   905
	self._write_lock = nil;
11701
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
   906
	if self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   907
		self:setwritetimeout();
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   908
		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
   909
	end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   910
end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   911
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   912
-- Connected!
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   913
function interface:onconnect()
10642
92918212ee83 net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents: 10593
diff changeset
   914
	self._connected = true;
9597
dcf466e04f81 net.server_epoll: Use method to update peername on connect
Kim Alvefur <zash@zash.se>
parents: 9590
diff changeset
   915
	self:updatenames();
10335
76bd77ad6a2a server_epoll: Log full string represestation when connected
Kim Alvefur <zash@zash.se>
parents: 10334
diff changeset
   916
	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
   917
	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
   918
	self:on("connect");
8509
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8274
diff changeset
   919
end
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8274
diff changeset
   920
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
   921
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
   922
	local server = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   923
		conn = conn;
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   924
		created = realtime();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   925
		listeners = listeners;
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   926
		read_size = config and config.read_size;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   927
		onreadable = interface.onacceptable;
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   928
		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
   929
		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
   930
		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
   931
		sockname = addr;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   932
		sockport = port;
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   933
		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
   934
	}, interface_mt);
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   935
	server:debug("Server %s created", server);
12516
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12485
diff changeset
   936
	if cfg.tcp_fastopen then
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12485
diff changeset
   937
		server:setoption("tcp-fastopen", cfg.tcp_fastopen);
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12485
diff changeset
   938
	end
12519
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12518
diff changeset
   939
	if type(cfg.tcp_defer_accept) == "number" then
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12518
diff changeset
   940
		server:setoption("tcp-defer-accept", cfg.tcp_defer_accept);
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12518
diff changeset
   941
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   942
	server:add(true, false);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   943
	return server;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   944
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   945
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
   946
local function listen(addr, port, listeners, config)
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   947
	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
   948
	if not conn then return conn, err; end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   949
	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
   950
	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
   951
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
   952
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   953
-- COMPAT
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   954
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
   955
	return listen(addr, port, listeners, {
9313
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9312
diff changeset
   956
		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
   957
		tls_ctx = tls_ctx;
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   958
		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
   959
	});
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   960
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   961
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   962
-- COMPAT
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10685
diff changeset
   963
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
   964
	local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra);
12517
6efbcd52db21 net.server_epoll: Move call to refresh remote IP address out of wrapper
Kim Alvefur <zash@zash.se>
parents: 12516
diff changeset
   965
	client:updatenames();
7600
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   966
	if not client.peername then
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   967
		client.peername, client.peerport = addr, port;
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   968
	end
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   969
	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
   970
	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
   971
	if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   972
		client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   973
	end
7554
838212918f11 net.server_epoll: Rename arguments and varibles for consistensy
Kim Alvefur <zash@zash.se>
parents: 7553
diff changeset
   974
	return client;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   975
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   976
7803
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7802
diff changeset
   977
-- 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
   978
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
   979
	local create;
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   980
	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
   981
		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
   982
		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
   983
		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
   984
			typ = "tcp6";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   985
		else
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   986
			typ = "tcp4";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   987
		end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   988
	end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   989
	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
   990
		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
   991
	end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   992
	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
   993
		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
   994
	end
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   995
	local conn, err = create();
10086
1df53ef1f60d net.server_epoll: Return errors from creating sockets
Kim Alvefur <zash@zash.se>
parents: 10085
diff changeset
   996
	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
   997
	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
   998
	if not ok then return ok, err; end
12518
194469fb46f9 net.server_epoll: Wrap LuaSocket object earlier to reuse option setting method
Kim Alvefur <zash@zash.se>
parents: 12517
diff changeset
   999
	local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra)
12516
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12485
diff changeset
  1000
	if cfg.tcp_fastopen then
12518
194469fb46f9 net.server_epoll: Wrap LuaSocket object earlier to reuse option setting method
Kim Alvefur <zash@zash.se>
parents: 12517
diff changeset
  1001
		client:setoption("tcp-fastopen-connect", 1);
12516
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12485
diff changeset
  1002
	end
9502
36e379f058c8 net.server: Swich method for connecting sockets with remotes
Kim Alvefur <zash@zash.se>
parents: 9501
diff changeset
  1003
	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
  1004
	if not ok and err ~= "timeout" then return ok, err; end
12517
6efbcd52db21 net.server_epoll: Move call to refresh remote IP address out of wrapper
Kim Alvefur <zash@zash.se>
parents: 12516
diff changeset
  1005
	client:updatenames();
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
  1006
	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
  1007
	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
  1008
		-- 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
  1009
		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
  1010
	end
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
  1011
	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
  1012
	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
  1013
	if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
  1014
		client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
  1015
	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
  1016
	return client, conn;
7556
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7555
diff changeset
  1017
end
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7555
diff changeset
  1018
9322
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9317
diff changeset
  1019
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
  1020
	local conn = setmetatable({
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1021
		conn = fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1022
		onreadable = onreadable;
9322
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9317
diff changeset
  1023
		onwritable = onwritable;
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1024
		close = function (self)
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1025
			self:del();
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1026
		end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1027
	}, interface_mt);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1028
	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
  1029
		conn.getfd = function ()
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1030
			return fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1031
		end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1032
		-- 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
  1033
	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
  1034
	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
  1035
	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
  1036
	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
  1037
	return conn;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1038
end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1039
7803
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7802
diff changeset
  1040
-- 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
  1041
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
  1042
	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
  1043
	function from:onincoming(data)
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
  1044
		self:pause();
11809
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
  1045
		to:write(data);
10288
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
  1046
	end
10289
bcf61e22f841 net.server_epoll: Ignore unused self argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10288
diff changeset
  1047
	function to:ondrain() -- luacheck: ignore 212/self
11809
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11808
diff changeset
  1048
		from:resume();
10288
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
  1049
	end
10287
dff360d00dfa net.server_epoll: Handle read size argument to link
Kim Alvefur <zash@zash.se>
parents: 10286
diff changeset
  1050
	from:set_mode(read_size);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1051
	from:set(true, nil);
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1052
	to:set(nil, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1053
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1054
9441
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9435
diff changeset
  1055
-- COMPAT
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9435
diff changeset
  1056
-- 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
  1057
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
  1058
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1059
7803
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7802
diff changeset
  1060
-- 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
  1061
local function closeall()
7802
93643a61858a server_epoll: Ignore unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7800
diff changeset
  1062
	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
  1063
		conn:close();
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
  1064
	end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
  1065
end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
  1066
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1067
local quitting = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1068
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
  1069
-- 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
  1070
local function setquitting(quit)
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
  1071
	if quit then
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
  1072
		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
  1073
		closeall();
11814
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
  1074
		addtimer(1, function ()
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
  1075
			if quitting then
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
  1076
				closeall();
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
  1077
				return 1;
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
  1078
			end
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
  1079
		end);
11815
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
  1080
		if cfg.shutdown_deadline then
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
  1081
			addtimer(cfg.shutdown_deadline, function ()
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
  1082
				if quitting then
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
  1083
					for fd, conn in pairs(fds) do -- luacheck: ignore 213/fd
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
  1084
						conn:destroy();
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
  1085
					end
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
  1086
				end
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
  1087
			end);
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
  1088
		end
7799
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
  1089
	else
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
  1090
		quitting = nil;
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
  1091
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1092
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1093
12831
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1094
local function loop_once()
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1095
	runtimers(); -- Ignore return value because we only do this once
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1096
	local fd, r, w = poll:wait(0);
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1097
	if fd then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1098
		local conn = fds[fd];
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1099
		if conn then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1100
			if r then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1101
				conn:onreadable();
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1102
			end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1103
			if w then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1104
				conn:onwritable();
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1105
			end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1106
		else
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1107
			log("debug", "Removing unknown fd %d", fd);
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1108
			poll:del(fd);
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1109
		end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1110
	else
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1111
		return fd, r;
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1112
	end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1113
end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1114
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
  1115
-- 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
  1116
local function loop(once)
12831
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1117
	if once then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1118
		return loop_once();
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1119
	end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12598
diff changeset
  1120
12832
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12831
diff changeset
  1121
	local t = 0;
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12831
diff changeset
  1122
	while not quitting do
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1123
		local fd, r, w = poll:wait(t);
12832
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12831
diff changeset
  1124
		if fd then
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12831
diff changeset
  1125
			t = 0;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1126
			local conn = fds[fd];
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1127
			if conn then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1128
				if r then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1129
					conn:onreadable();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1130
				end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1131
				if w then
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
  1132
					conn:onwritable();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1133
				end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1134
			else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1135
				log("debug", "Removing unknown fd %d", fd);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1136
				poll:del(fd);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1137
			end
12832
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12831
diff changeset
  1138
		elseif r == "timeout" then
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12831
diff changeset
  1139
			t = runtimers(cfg.max_wait, cfg.min_wait);
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12831
diff changeset
  1140
		elseif r ~= "signal" then
9448
af7eafe82447 net.server_epoll: Log error number from wait()
Kim Alvefur <zash@zash.se>
parents: 9444
diff changeset
  1141
			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
  1142
		end
12832
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12831
diff changeset
  1143
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1144
	return quitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1145
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1146
13444
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1147
local hook_signal;
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1148
if have_signal and signal.signalfd then
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1149
	local function dispatch(self)
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
  1150
		return self:on("signal", self.conn:read());
13444
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1151
	end
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1152
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1153
	function hook_signal(signum, cb)
13451
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13445
diff changeset
  1154
		local sigfd = signal.signalfd(signum);
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13445
diff changeset
  1155
		if not sigfd then
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13445
diff changeset
  1156
			log("error", "Could not hook signal %d", signum);
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13445
diff changeset
  1157
			return nil, "failed";
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13445
diff changeset
  1158
		end
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13445
diff changeset
  1159
		local watch = watchfd(sigfd, dispatch);
13444
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1160
		watch.listeners = { onsignal = cb };
13445
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13444
diff changeset
  1161
		watch.close = nil; -- revert to default
13454
f36e1e1b84fe net.server_epoll: Log creation of signalfd handles at noise level
Kim Alvefur <zash@zash.se>
parents: 13451
diff changeset
  1162
		watch:noise("Signal handler %d ready", signum);
13444
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1163
		return watch;
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1164
	end
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1165
end
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1166
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1167
return {
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1168
	get_backend = function () return "epoll"; end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1169
	addserver = addserver;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1170
	addclient = addclient;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1171
	add_task = addtimer;
10987
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
  1172
	timer = {
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
  1173
		-- API-compatible with util.timer
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
  1174
		add_task = addtimer;
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
  1175
		stop = closetimer;
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
  1176
		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
  1177
		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
  1178
			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
  1179
		end;
10987
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
  1180
	};
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
  1181
	listen = listen;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1182
	loop = loop;
7797
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
  1183
	closeall = closeall;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1184
	setquitting = setquitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1185
	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
  1186
	wrapserver = wrapserver;
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
  1187
	watchfd = watchfd;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1188
	link = link;
7660
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
  1189
	set_config = function (newconfig)
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
  1190
		cfg = setmetatable(newconfig, default_config);
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
  1191
	end;
13444
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13426
diff changeset
  1192
	hook_signal = hook_signal;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1193
12485
2ee27587fec7 net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents: 12484
diff changeset
  1194
	tls_builder = function(basedir)
2ee27587fec7 net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents: 12484
diff changeset
  1195
		return sslconfig._new(tls_impl.new_context, basedir)
2ee27587fec7 net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents: 12484
diff changeset
  1196
	end,
2ee27587fec7 net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents: 12484
diff changeset
  1197
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1198
	-- libevent emulation
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1199
	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
  1200
	addevent = function (fd, mode, callback)
10092
97da8452c6a6 net.server_epoll: Deprecate libevent emulation layer
Kim Alvefur <zash@zash.se>
parents: 10086
diff changeset
  1201
		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
  1202
		local function onevent(self)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1203
			local ret = self:callback();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1204
			if ret == -1 then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1205
				self:set(false, false);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1206
			elseif ret then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1207
				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
  1208
			end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1209
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1210
7820
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
  1211
		local conn = setmetatable({
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
  1212
			getfd = function () return fd; end;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1213
			callback = callback;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1214
			onreadable = onevent;
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
  1215
			onwritable = onevent;
7820
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
  1216
			close = function (self)
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
  1217
				self:del();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1218
				fds[fd] = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1219
			end;
7820
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
  1220
		}, 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
  1221
		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
  1222
		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
  1223
		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
  1224
		if not ok then return ok, err; end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1225
		return conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1226
	end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
  1227
};