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