net/server_epoll.lua
author Kim Alvefur <zash@zash.se>
Tue, 30 Jun 2020 17:34:39 +0200
changeset 10994 03e76ad725b2
parent 10993 b824fe9d0c8b
child 10995 aa85cb5b859f
permissions -rw-r--r--
net.server_epoll: ... and include a traceback
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;
10590
f86ed818a7f8 net.server_epoll: Collect full traceback from errors in listeners
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
    16
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
    17
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
    18
local log = logger.init("server_epoll");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
local socket = require "socket";
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
local luasec = require "ssl";
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;
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
    28
local new_id = require "util.id".medium;
10590
f86ed818a7f8 net.server_epoll: Collect full traceback from errors in listeners
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
    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
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9668
diff changeset
    56
	-- If there is still more data to read from LuaSocktes 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;
7661
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7660
diff changeset
    67
	min_wait = 1e-06;
10085
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10084
diff changeset
    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
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
    70
	-- TODO disable once considered stable
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
    71
	verbose = true;
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
    72
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
    73
	-- 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
    74
	-- 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
    75
	fatal_errors = false;
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
    76
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
    77
	-- Attempt writes instantly
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
    78
	opportunistic_writes = false;
7660
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
    79
}};
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
    80
local cfg = default_config.__index;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
local fds = createtable(10, 0); -- FD -> conn
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
    83
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
    84
-- Timer and scheduling --
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
    85
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
    86
local timers = indexedbheap.create();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    87
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
local function noop() end
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
    89
local function closetimer(id)
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
    90
	timers:remove(id);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
    93
local function reschedule(id, time)
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
    94
	time = monotonic() + time;
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
    95
	timers:reprioritize(id, time);
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
    96
end
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
    97
10494
c9cff02c0528 net.server_epoll: Remove unused function for adding timer at absolute time
Kim Alvefur <zash@zash.se>
parents: 10490
diff changeset
    98
-- Add relative timer
10986
276f16101d59 net.server_epoll: Make API-compatible with util.timer
Kim Alvefur <zash@zash.se>
parents: 10865
diff changeset
    99
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
   100
	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
   101
	if param ~= nil then
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   102
		local timer_callback = f
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   103
		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
   104
			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
   105
			return t;
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   106
		end
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   107
	end
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   108
	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
   109
	return id;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   110
end
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   111
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   112
-- Run callbacks of expired timers
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   113
-- 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
   114
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
   115
	-- Any timers at all?
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   116
	local elapsed = monotonic();
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   117
	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
   118
	local peek = timers:peek();
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   119
	while peek do
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   120
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   121
		if peek > elapsed then
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   122
			next_delay = peek - elapsed;
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   123
			break;
10685
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10063
diff changeset
   124
		end
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   125
10989
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   126
		local _, timer, id = timers:pop();
10994
03e76ad725b2 net.server_epoll: ... and include a traceback
Kim Alvefur <zash@zash.se>
parents: 10993
diff changeset
   127
		local ok, ret = xpcall(timer, traceback, now, id);
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   128
		if ok and type(ret) == "number"  then
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   129
			local next_time = elapsed+ret;
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   130
			timers:insert(timer, next_time);
10993
b824fe9d0c8b net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
   131
		elseif not ok then
b824fe9d0c8b net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
   132
			log("error", "Error in timer: %s", ret);
10685
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10063
diff changeset
   133
		end
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   134
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   135
		peek = timers:peek();
10685
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10063
diff changeset
   136
	end
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   137
	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
   138
		return next_delay;
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7631
diff changeset
   139
	end
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7631
diff changeset
   140
10063
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9998
diff changeset
   141
	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
   142
		return min_wait;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   143
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   144
	return next_delay;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   145
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   146
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   147
-- Socket handler interface
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   148
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   149
local interface = {};
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   150
local interface_mt = { __index = interface };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   151
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   152
function interface_mt:__tostring()
7588
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7587
diff changeset
   153
	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
   154
		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
   155
	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
   156
		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
   157
	end
9324
146dc1e4c7ff net.server_epoll: Simplify minimal string representation
Kim Alvefur <zash@zash.se>
parents: 9323
diff changeset
   158
	return ("FD %d"):format(self:getfd());
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   159
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   160
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   161
interface.log = log;
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   162
function interface:debug(msg, ...) --luacheck: ignore 212/self
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   163
	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
   164
end
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   165
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   166
interface.noise = interface.debug;
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   167
function interface:noise(msg, ...) --luacheck: ignore 212/self
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   168
	if cfg.verbose then
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   169
		return self:debug(msg, ...);
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   170
	end
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   171
end
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   172
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   173
function interface:error(msg, ...) --luacheck: ignore 212/self
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   174
	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
   175
end
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   176
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   177
-- 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
   178
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
   179
	self:on("detach");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   180
	self.listeners = listeners;
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   181
	self:on("attach", data);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   182
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   183
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   184
-- 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
   185
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
   186
	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
   187
		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
   188
		return;
be374a5778f3 net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents: 7913
diff changeset
   189
	end
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   190
	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
   191
	if not listener then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   192
		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
   193
		return;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   194
	end
10590
f86ed818a7f8 net.server_epoll: Collect full traceback from errors in listeners
Kim Alvefur <zash@zash.se>
parents: 10575
diff changeset
   195
	local ok, err = xpcall(listener, traceback, self, ...);
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   196
	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
   197
		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
   198
			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
   199
			self:destroy();
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   200
		else
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   201
			self:debug("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
   202
		end
10084
39ca4202ae1e net.server_epoll: Return listener error message
Kim Alvefur <zash@zash.se>
parents: 10065
diff changeset
   203
		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
   204
	end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   205
	return err;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   206
end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   207
10282
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   208
-- 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
   209
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
   210
	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
   211
end
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10238
diff changeset
   212
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   213
-- Return the file descriptor number
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   214
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
   215
	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
   216
		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
   217
	end
7740
f93b3083b46b net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents: 7710
diff changeset
   218
	return _SOCKETINVALID;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   219
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   220
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
   221
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
   222
	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
   223
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
   224
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   225
-- Get IP address
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   226
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
   227
	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
   228
end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   229
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   230
-- 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
   231
function interface:port()
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   232
	return self.sockport or self.peerport;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   233
end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   234
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   235
-- Get local port number
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   236
function interface:clientport()
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   237
	return self.sockport;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   238
end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   239
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   240
-- Get remote port
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   241
function interface:serverport()
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   242
	if self.sockport then
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   243
		return self.sockport;
8274
c09deab9989e net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents: 8094
diff changeset
   244
	elseif self._server then
c09deab9989e net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents: 8094
diff changeset
   245
		self._server:port();
7587
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   246
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   247
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   248
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   249
-- Return underlying socket
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   250
function interface:socket()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   251
	return self.conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   252
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   253
7913
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7820
diff changeset
   254
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
   255
	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
   256
end
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7820
diff changeset
   257
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   258
function interface:setoption(k, v)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   259
	-- LuaSec doesn't expose setoption :(
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   260
	if self.conn.setoption then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   261
		self.conn:setoption(k, v);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   262
	end
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
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   265
-- Timeout for detecting dead or idle sockets
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   266
function interface:setreadtimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   267
	if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   268
		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
   269
			closetimer(self._readtimeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   270
			self._readtimeout = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   271
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   272
		return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   273
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   274
	t = t or cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   275
	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
   276
		reschedule(self._readtimeout, t);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   277
	else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   278
		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
   279
			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
   280
				self:noise("Read timeout handled");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   281
				return cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   282
			else
10421
d8a0b0d21c81 net.server_epoll: Improve read timeout debug messages
Kim Alvefur <zash@zash.se>
parents: 10420
diff changeset
   283
				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
   284
				self:on("disconnect", "read timeout");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   285
				self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   286
			end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   287
		end);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   288
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   289
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   290
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   291
-- Timeout for detecting dead sockets
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   292
function interface:setwritetimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   293
	if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   294
		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
   295
			closetimer(self._writetimeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   296
			self._writetimeout = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   297
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   298
		return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   299
	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
   300
	t = t or cfg.send_timeout;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   301
	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
   302
		reschedule(self._writetimeout, t);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   303
	else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   304
		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
   305
			self:noise("Write timeout");
10642
92918212ee83 net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents: 10593
diff changeset
   306
			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
   307
			self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   308
		end);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   309
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   310
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   311
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   312
function interface:add(r, w)
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   313
	local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   314
	if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   315
		return nil, "invalid fd";
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   316
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   317
	if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   318
	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
   319
	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
   320
	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
   321
		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
   322
			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
   323
			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
   324
		end
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   325
		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
   326
		return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   327
	end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   328
	self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   329
	fds[fd] = self;
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   330
	self:noise("Registered in poller");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   331
	return true;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   332
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   333
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   334
function interface:set(r, w)
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   335
	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
   336
	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
   337
		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
   338
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   339
	if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   340
	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
   341
	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
   342
	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
   343
		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
   344
		return ok, err;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   345
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   346
	self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   347
	return true;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   348
end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   349
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   350
function interface:del()
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   351
	local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   352
	if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   353
		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
   354
	end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   355
	if fds[fd] ~= self then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   356
		return nil, "unregistered fd";
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   357
	end
9387
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9386
diff changeset
   358
	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
   359
	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
   360
		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
   361
		return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   362
	end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   363
	self._wantread, self._wantwrite = nil, nil;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   364
	fds[fd] = nil;
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   365
	self:noise("Unregistered from poller");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   366
	return true;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   367
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   368
9323
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   369
function interface:setflags(r, w)
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   370
	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
   371
		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
   372
			return true; -- no change
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   373
		end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   374
		return self:add(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   375
	end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   376
	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
   377
		return self:del();
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   378
	end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   379
	return self:set(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   380
end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9322
diff changeset
   381
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   382
-- Called when socket is readable
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   383
function interface:onreadable()
9314
9b0604fe01f1 net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents: 9313
diff changeset
   384
	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
   385
	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
   386
		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
   387
		self:onincoming(data);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   388
	else
9935
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   389
		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
   390
			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
   391
			err = "timeout";
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   392
		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
   393
			self:set(nil, true);
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   394
			err = "timeout";
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   395
		end
8543
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   396
		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
   397
			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
   398
			self:onincoming(partial, err);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   399
		end
9935
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9826
diff changeset
   400
		if err ~= "timeout" then
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   401
			self:on("disconnect", err);
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   402
			self:destroy()
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   403
			return;
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   404
		end
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   405
	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
   406
	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
   407
	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
   408
		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
   409
		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
   410
			self:setreadtimeout(false);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   411
			self:pausefor(cost);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   412
			return;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   413
		end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   414
	end
9936
df73ca804719 net.server_epoll: Skip delayed continuation read on paused connections
Kim Alvefur <zash@zash.se>
parents: 9935
diff changeset
   415
	if self._wantread and self.conn:dirty() then
7609
f40f1d9b7872 net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents: 7607
diff changeset
   416
		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
   417
		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
   418
	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
   419
		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
   420
	end
7550
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
7576
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7567
diff changeset
   423
-- Called when socket is writable
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   424
function interface:onwritable()
8555
1fcefc16a55d server_epoll: Onconnect should happen before first attempt to write to socket
Kim Alvefur <zash@zash.se>
parents: 8545
diff changeset
   425
	self:onconnect();
8779
e7d4344e0fea net.server_epoll: Handle connection being closed and destroyed in onconnect callback
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   426
	if not self.conn then return; end -- could have been closed in onconnect
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   427
	local buffer = self.writebuffer;
10575
cfeb0077c9e9 net.server_epoll: Avoid concatenating buffer with single item
Kim Alvefur <zash@zash.se>
parents: 10550
diff changeset
   428
	local data = #buffer == 1 and buffer[1] or t_concat(buffer);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   429
	local ok, err, partial = self.conn:send(data);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   430
	if ok then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   431
		self:set(nil, false);
8544
8186114329d6 net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents: 8543
diff changeset
   432
		for i = #buffer, 1, -1 do
8186114329d6 net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents: 8543
diff changeset
   433
			buffer[i] = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   434
		end
8544
8186114329d6 net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents: 8543
diff changeset
   435
		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
   436
		self:ondrain(); -- Be aware of writes in ondrain
7592
125e4f2e0b65 net.server_epoll: Return early on successful write
Kim Alvefur <zash@zash.se>
parents: 7591
diff changeset
   437
		return;
8543
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8510
diff changeset
   438
	elseif partial then
10309
2fadbf209678 net.server_epoll: Log size of partial writes (debug)
Kim Alvefur <zash@zash.se>
parents: 10304
diff changeset
   439
		self:debug("Sent %d out of %d buffered bytes", partial, #data);
7594
138f16eb39fb net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
   440
		buffer[1] = data:sub(partial+1);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   441
		for i = #buffer, 2, -1 do
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   442
			buffer[i] = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   443
		end
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   444
		self:set(nil, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   445
		self:setwritetimeout();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   446
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   447
	if err == "wantwrite" or err == "timeout" then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   448
		self:set(nil, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   449
	elseif err == "wantread" then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   450
		self:set(true, nil);
7690
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7661
diff changeset
   451
	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
   452
		self:on("disconnect", err);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   453
		self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   454
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   455
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   456
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   457
-- The write buffer has been successfully emptied
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   458
function interface:ondrain()
8011
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8010
diff changeset
   459
	return self:on("drain");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   460
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   461
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   462
-- 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
   463
function interface:write(data)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   464
	local buffer = self.writebuffer;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   465
	if buffer then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   466
		t_insert(buffer, data);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   467
	else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   468
		self.writebuffer = { data };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   469
	end
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   470
	if not self._write_lock then
10232
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   471
		if cfg.opportunistic_writes then
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   472
			self:onwritable();
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   473
			return #data;
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10102
diff changeset
   474
		end
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   475
		self:setwritetimeout();
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   476
		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
   477
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   478
	return #data;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   479
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   480
interface.send = interface.write;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   481
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   482
-- Close, possibly after writing is done
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   483
function interface:close()
8010
67f8954875a4 net.server_epoll: Check write buffer for remaining data to write when closing
Kim Alvefur <zash@zash.se>
parents: 8009
diff changeset
   484
	if self.writebuffer and self.writebuffer[1] then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   485
		self:set(false, true); -- Flush final buffer contents
7596
0266434d7df1 net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents: 7595
diff changeset
   486
		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
   487
		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
   488
		self.ondrain = interface.close;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   489
	else
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   490
		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
   491
		self.write, self.send = noop, noop;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   492
		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
   493
		self:on("disconnect");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   494
		self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   495
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   496
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   497
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   498
function interface:destroy()
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   499
	self:del();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   500
	self:setwritetimeout(false);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   501
	self:setreadtimeout(false);
7597
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   502
	self.onreadable = noop;
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   503
	self.onwritable = noop;
7597
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   504
	self.destroy = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   505
	self.close = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   506
	self.on = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   507
	self.conn:close();
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
   508
	self.conn = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   509
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   510
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   511
function interface:ssl()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   512
	return self._tls;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   513
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   514
9303
1df8832bd29e net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   515
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
   516
	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
   517
	self.starttls = false;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   518
	if self.writebuffer and self.writebuffer[1] then
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   519
		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
   520
		self.ondrain = interface.starttls;
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   521
		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
   522
	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
   523
		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
   524
			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
   525
		end
10851
42c8dce6e765 net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents: 10850
diff changeset
   526
		self.onwritable = interface.tlshandshake;
42c8dce6e765 net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents: 10850
diff changeset
   527
		self.onreadable = 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
   528
		self:set(true, true);
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   529
		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
   530
	end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   531
end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   532
10851
42c8dce6e765 net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents: 10850
diff changeset
   533
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
   534
	self:setwritetimeout(false);
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   535
	self:setreadtimeout(false);
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   536
	if not self._tls then
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   537
		self._tls = true;
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   538
		self:debug("Starting TLS now");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   539
		self:del();
10333
c0a72c97e6cf net.server_epoll: Fix to get remote IP on direct TLS connections
Kim Alvefur <zash@zash.se>
parents: 10332
diff changeset
   540
		self:updatenames(); -- Can't getpeer/sockname after wrap()
9434
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9433
diff changeset
   541
		local ok, conn, err = pcall(luasec.wrap, self.conn, self.tls_ctx);
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9433
diff changeset
   542
		if not ok then
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9433
diff changeset
   543
			conn, err = ok, conn;
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   544
			self:debug("Failed to initialize TLS: %s", err);
9434
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9433
diff changeset
   545
		end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   546
		if not conn then
7586
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7577
diff changeset
   547
			self:on("disconnect", err);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   548
			self:destroy();
7598
166b2e0766a4 net.server_epoll: Return status from starttls method
Kim Alvefur <zash@zash.se>
parents: 7597
diff changeset
   549
			return conn, err;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   550
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   551
		conn:settimeout(0);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   552
		self.conn = conn;
9851
adc0672b700e net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   553
		if conn.sni then
adc0672b700e net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   554
			if self.servername then
adc0672b700e net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   555
				conn:sni(self.servername);
9857
9aea8dbb105d net.server: Only add alternate SNI contexts if at least one is provided
Kim Alvefur <zash@zash.se>
parents: 9851
diff changeset
   556
			elseif self._server and type(self._server.hosts) == "table" and next(self._server.hosts) ~= nil then
9851
adc0672b700e net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   557
				conn:sni(self._server.hosts, true);
adc0672b700e net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   558
			end
adc0672b700e net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   559
		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
   560
		self:on("starttls");
8011
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8010
diff changeset
   561
		self.ondrain = nil;
10851
42c8dce6e765 net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents: 10850
diff changeset
   562
		self.onwritable = interface.tlshandshake;
42c8dce6e765 net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents: 10850
diff changeset
   563
		self.onreadable = interface.tlshandshake;
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   564
		return self:init();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   565
	end
10850
d0b098d0f6c3 net.server_epoll: Log some noise before TLS handshake step
Kim Alvefur <zash@zash.se>
parents: 10687
diff changeset
   566
	self:noise("Continuing TLS handshake");
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   567
	local ok, err = self.conn:dohandshake();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   568
	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
   569
		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
   570
		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
   571
			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
   572
		else
6a997f0ceba8 net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents: 10309
diff changeset
   573
			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
   574
		end
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   575
		self.onwritable = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   576
		self.onreadable = nil;
8011
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8010
diff changeset
   577
		self:on("status", "ssl-handshake-complete");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   578
		self:setwritetimeout();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   579
		self:set(true, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   580
	elseif err == "wantread" then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   581
		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
   582
		self:set(true, false);
9826
13c2707d2417 net.server_epoll: Rename handshake_timeout to ssl_handshake_timeout (fixes #1319)
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
   583
		self:setreadtimeout(cfg.ssl_handshake_timeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   584
	elseif err == "wantwrite" then
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   585
		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
   586
		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
   587
		self:setwritetimeout(cfg.ssl_handshake_timeout);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   588
	else
10653
228277be4a28 net.server_epoll: Reduce log level of TLS handshake errors to debug
Kim Alvefur <zash@zash.se>
parents: 10642
diff changeset
   589
		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
   590
		self:on("disconnect", err);
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
10237
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 10232
diff changeset
   595
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
   596
	client:settimeout(0);
10283
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10282
diff changeset
   597
	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
   598
	local conn = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   599
		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
   600
		_server = server;
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   601
		created = realtime();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   602
		listeners = listeners;
9313
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9312
diff changeset
   603
		read_size = read_size or (server and server.read_size);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   604
		writebuffer = {};
9435
2e3f66475cc8 net.server_epoll: Inherit Direct TLS flag from servers to their clients
Kim Alvefur <zash@zash.se>
parents: 9434
diff changeset
   605
		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
   606
		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
   607
		id = conn_id;
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10282
diff changeset
   608
		log = logger.init(conn_id);
10237
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 10232
diff changeset
   609
		extra = extra;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   610
	}, interface_mt);
7594
138f16eb39fb net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
   611
10238
d4390c427a66 net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents: 10237
diff changeset
   612
	if extra then
d4390c427a66 net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents: 10237
diff changeset
   613
		if extra.servername then
d4390c427a66 net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents: 10237
diff changeset
   614
			conn.servername = extra.servername;
d4390c427a66 net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents: 10237
diff changeset
   615
		end
d4390c427a66 net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents: 10237
diff changeset
   616
	end
d4390c427a66 net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents: 10237
diff changeset
   617
9386
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   618
	conn:updatenames();
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   619
	return conn;
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   620
end
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   621
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   622
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
   623
	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
   624
	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
   625
	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
   626
		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
   627
	end
9386
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
   628
	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
   629
	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
   630
		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
   631
	end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   632
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   633
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   634
-- A server interface has new incoming connections waiting
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   635
-- This replaces the onreadable callback
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   636
function interface:onacceptable()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   637
	local conn, err = self.conn:accept();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   638
	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
   639
		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
   640
		self:pausefor(cfg.accept_retry_interval);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   641
		return;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   642
	end
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   643
	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
   644
	client:debug("New connection %s on server %s", client, self);
9433
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   645
	client:init();
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   646
	if self.tls_direct then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   647
		client:starttls(self.tls_ctx);
9699
5ec4eaf76de8 net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents: 9670
diff changeset
   648
	else
5ec4eaf76de8 net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents: 9670
diff changeset
   649
		client:onconnect();
9312
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   650
	end
7600
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   651
end
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   652
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   653
-- Initialization
7600
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   654
function interface:init()
9828
729de68f0068 net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents: 9827
diff changeset
   655
	self:setwritetimeout(cfg.connect_timeout);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   656
	return self:add(true, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   657
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   658
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   659
function interface:pause()
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   660
	self:noise("Pause reading");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   661
	return self:set(false);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   662
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   663
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   664
function interface:resume()
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   665
	self:noise("Resume reading");
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   666
	return self:set(true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   667
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   668
7627
23fb3a084956 net.server_epoll: Comments
Kim Alvefur <zash@zash.se>
parents: 7626
diff changeset
   669
-- Pause connection for some time
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   670
function interface:pausefor(t)
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   671
	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
   672
	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
   673
		closetimer(self._pausefor);
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10988
diff changeset
   674
		self._pausefor = nil;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   675
	end
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   676
	if t == false then return; end
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   677
	self:set(false);
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   678
	self._pausefor = addtimer(t, function ()
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   679
		self._pausefor = nil;
9998
524b8cd76780 net.server_epoll: Restore wantread flag after pause (fixes #1354)
Kim Alvefur <zash@zash.se>
parents: 9936
diff changeset
   680
		self:set(true);
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   681
		self:noise("Resuming after pause, connection is %s", not self.conn and "missing" or self.conn:dirty() and "dirty" or "clean");
7710
7bb1cc7278b6 net.server_epoll: Make sure socket exists before checking if there is buffered data in it
Kim Alvefur <zash@zash.se>
parents: 7694
diff changeset
   682
		if self.conn and self.conn:dirty() then
7563
785fa1138293 net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents: 7562
diff changeset
   683
			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
   684
		end
7562
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7561
diff changeset
   685
	end);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   686
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   687
10102
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   688
function interface:setlimit(Bps)
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   689
	if Bps > 0 then
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   690
		self._limit = 1/Bps;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   691
	else
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   692
		self._limit = nil;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   693
	end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   694
end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10095
diff changeset
   695
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   696
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
   697
	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
   698
		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
   699
	end
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   700
	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
   701
	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
   702
	self:setwritetimeout(false);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   703
	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
   704
end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   705
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   706
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
   707
	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
   708
		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
   709
	end
10591
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10590
diff changeset
   710
	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
   711
	self._write_lock = nil;
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   712
	if self.writebuffer[1] then
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   713
		self:setwritetimeout();
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   714
		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
   715
	end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   716
end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9576
diff changeset
   717
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   718
-- Connected!
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   719
function interface:onconnect()
10642
92918212ee83 net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents: 10593
diff changeset
   720
	self._connected = true;
9597
dcf466e04f81 net.server_epoll: Use method to update peername on connect
Kim Alvefur <zash@zash.se>
parents: 9590
diff changeset
   721
	self:updatenames();
10335
76bd77ad6a2a server_epoll: Log full string represestation when connected
Kim Alvefur <zash@zash.se>
parents: 10334
diff changeset
   722
	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
   723
	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
   724
	self:on("connect");
8509
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8274
diff changeset
   725
end
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8274
diff changeset
   726
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
   727
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
   728
	local server = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   729
		conn = conn;
10496
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10495
diff changeset
   730
		created = realtime();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   731
		listeners = listeners;
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   732
		read_size = config and config.read_size;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   733
		onreadable = interface.onacceptable;
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   734
		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
   735
		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
   736
		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
   737
		sockname = addr;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7586
diff changeset
   738
		sockport = port;
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   739
		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
   740
	}, interface_mt);
10093
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10092
diff changeset
   741
	server:debug("Server %s created", server);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   742
	server:add(true, false);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   743
	return server;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   744
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   745
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
   746
local function listen(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
   747
	local conn, err = socket.bind(addr, port, cfg.tcp_backlog);
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10858
diff changeset
   748
	if not conn then return conn, err; 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
   749
	conn:settimeout(0);
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10858
diff changeset
   750
	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
   751
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
   752
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   753
-- COMPAT
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   754
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
   755
	return listen(addr, port, listeners, {
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   756
		read_size = read_size;
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   757
		tls_ctx = tls_ctx;
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   758
		tls_direct = tls_ctx and true or false;
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   759
	});
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   760
end
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   761
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   762
-- COMPAT
10237
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 10232
diff changeset
   763
local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx, extra)
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 10232
diff changeset
   764
	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
   765
	if not client.peername then
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   766
		client.peername, client.peerport = addr, port;
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7599
diff changeset
   767
	end
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   768
	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
   769
	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
   770
	if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   771
		client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   772
	end
7554
838212918f11 net.server_epoll: Rename arguments and varibles for consistensy
Kim Alvefur <zash@zash.se>
parents: 7553
diff changeset
   773
	return client;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   774
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   775
7803
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7802
diff changeset
   776
-- New outgoing TCP connection
10237
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 10232
diff changeset
   777
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
   778
	local create;
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   779
	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
   780
		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
   781
		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
   782
		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
   783
			typ = "tcp6";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   784
		else
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   785
			typ = "tcp4";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   786
		end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   787
	end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   788
	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
   789
		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
   790
	end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9480
diff changeset
   791
	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
   792
		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
   793
	end
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   794
	local conn, err = create();
10086
1df53ef1f60d net.server_epoll: Return errors from creating sockets
Kim Alvefur <zash@zash.se>
parents: 10085
diff changeset
   795
	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
   796
	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
   797
	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
   798
	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
   799
	if not ok and err ~= "timeout" then return ok, err; end
10237
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 10232
diff changeset
   800
	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
   801
	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
   802
	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
   803
		-- 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
   804
		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
   805
	end
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9448
diff changeset
   806
	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
   807
	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
   808
	if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   809
		client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
   810
	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
   811
	return client, conn;
7556
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7555
diff changeset
   812
end
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7555
diff changeset
   813
9322
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9317
diff changeset
   814
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
   815
	local conn = setmetatable({
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   816
		conn = fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   817
		onreadable = onreadable;
9322
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9317
diff changeset
   818
		onwritable = onwritable;
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   819
		close = function (self)
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   820
			self:del();
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   821
		end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   822
	}, interface_mt);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   823
	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
   824
		conn.getfd = function ()
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   825
			return fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   826
		end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   827
		-- 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
   828
	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
   829
	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
   830
	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
   831
	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
   832
	return conn;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   833
end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   834
7803
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7802
diff changeset
   835
-- 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
   836
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
   837
	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
   838
	function from:onincoming(data)
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
   839
		self:pause();
10293
8c59b20f71dc net.server_epoll: Correct indentation
Kim Alvefur <zash@zash.se>
parents: 10289
diff changeset
   840
		to:write(data);
10288
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
   841
	end
10289
bcf61e22f841 net.server_epoll: Ignore unused self argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10288
diff changeset
   842
	function to:ondrain() -- luacheck: ignore 212/self
10293
8c59b20f71dc net.server_epoll: Correct indentation
Kim Alvefur <zash@zash.se>
parents: 10289
diff changeset
   843
		from:resume();
10288
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10287
diff changeset
   844
	end
10287
dff360d00dfa net.server_epoll: Handle read size argument to link
Kim Alvefur <zash@zash.se>
parents: 10286
diff changeset
   845
	from:set_mode(read_size);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   846
	from:set(true, nil);
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   847
	to:set(nil, true);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   848
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   849
9441
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9435
diff changeset
   850
-- COMPAT
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9435
diff changeset
   851
-- 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
   852
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
   853
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   854
7803
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7802
diff changeset
   855
-- 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
   856
local function closeall()
7802
93643a61858a server_epoll: Ignore unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7800
diff changeset
   857
	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
   858
		conn:close();
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   859
	end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   860
end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   861
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   862
local quitting = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   863
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   864
-- 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
   865
local function setquitting(quit)
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   866
	if quit then
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   867
		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
   868
		closeall();
7799
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   869
	else
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   870
		quitting = nil;
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7798
diff changeset
   871
	end
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   872
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   873
7640
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7633
diff changeset
   874
-- 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
   875
local function loop(once)
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   876
	repeat
7661
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7660
diff changeset
   877
		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
   878
		local fd, r, w = poll:wait(t);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   879
		if fd then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   880
			local conn = fds[fd];
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   881
			if conn then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   882
				if r then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   883
					conn:onreadable();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   884
				end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   885
				if w then
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   886
					conn:onwritable();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   887
				end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   888
			else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   889
				log("debug", "Removing unknown fd %d", fd);
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   890
				poll:del(fd);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   891
			end
9511
2055b497b515 net.server_epoll: Special handling of signal interrupts
Kim Alvefur <zash@zash.se>
parents: 9510
diff changeset
   892
		elseif r ~= "timeout" and r ~= "signal" then
9448
af7eafe82447 net.server_epoll: Log error number from wait()
Kim Alvefur <zash@zash.se>
parents: 9444
diff changeset
   893
			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
   894
		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
   895
	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
   896
	return quitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   897
end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   898
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   899
return {
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   900
	get_backend = function () return "epoll"; end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   901
	addserver = addserver;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   902
	addclient = addclient;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   903
	add_task = addtimer;
10987
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   904
	timer = {
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   905
		-- API-compatible with util.timer
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   906
		add_task = addtimer;
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   907
		stop = closetimer;
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   908
		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
   909
		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
   910
			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
   911
		end;
10987
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10986
diff changeset
   912
	};
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9829
diff changeset
   913
	listen = listen;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   914
	loop = loop;
7797
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7740
diff changeset
   915
	closeall = closeall;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   916
	setquitting = setquitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   917
	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
   918
	wrapserver = wrapserver;
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
   919
	watchfd = watchfd;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   920
	link = link;
7660
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
   921
	set_config = function (newconfig)
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
   922
		cfg = setmetatable(newconfig, default_config);
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7640
diff changeset
   923
	end;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   924
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   925
	-- libevent emulation
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   926
	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
   927
	addevent = function (fd, mode, callback)
10092
97da8452c6a6 net.server_epoll: Deprecate libevent emulation layer
Kim Alvefur <zash@zash.se>
parents: 10086
diff changeset
   928
		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
   929
		local function onevent(self)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   930
			local ret = self:callback();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   931
			if ret == -1 then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   932
				self:set(false, false);
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   933
			elseif ret then
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   934
				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
   935
			end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   936
		end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   937
7820
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
   938
		local conn = setmetatable({
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
   939
			getfd = function () return fd; end;
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   940
			callback = callback;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   941
			onreadable = onevent;
8545
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8544
diff changeset
   942
			onwritable = onevent;
7820
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
   943
			close = function (self)
9317
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
   944
				self:del();
7550
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   945
				fds[fd] = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   946
			end;
7820
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7814
diff changeset
   947
		}, 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
   948
		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
   949
		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
   950
		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
   951
		if not ok then return ok, err; end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   952
		return conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   953
	end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   954
};