Annotate

net/server_epoll.lua @ 13490:6f840763fc73

net.server_epoll: Add support for systemd socket activation Allows creating listening sockets and accepting client connections before Prosody starts. This is unlike normal Prosody dynamic resource management, where ports may added and removed at any time, and the ports defined by the config. Weird things happen if these are closed (e.g. due to reload) so here we prevent closing and ensure sockets are reused when opened again.
author Kim Alvefur <zash@zash.se>
date Tue, 14 May 2024 17:07:47 +0200
parent 13450:f36e1e1b84fe
child 13552:f0b2c026e542
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- Prosody IM
9474
619ba78709a5 net.server_epoll: Update copyright year
Kim Alvefur <zash@zash.se>
parents: 9473
diff changeset
2 -- Copyright (C) 2016-2018 Kim Alvefur
7547
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;
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
12 local pcall = pcall;
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
13 local type = type;
7797
d0c32d86724f server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents: 7796
diff changeset
14 local next = next;
7794
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
15 local pairs = pairs;
11413
9fb23779c863 net.server_epoll: Support for passing DANE TLSA data to LuaSec (0.8 needed)
Kim Alvefur <zash@zash.se>
parents: 11267
diff changeset
16 local ipairs = ipairs;
10586
f86ed818a7f8 net.server_epoll: Collect full traceback from errors in listeners
Kim Alvefur <zash@zash.se>
parents: 10571
diff changeset
17 local traceback = debug.traceback;
12974
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
18 local logger = require "prosody.util.logger";
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
19 local log = logger.init("server_epoll");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 local socket = require "socket";
12974
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
21 local realtime = require "prosody.util.time".now;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
22 local monotonic = require "prosody.util.time".monotonic;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
23 local indexedbheap = require "prosody.util.indexedbheap";
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
24 local createtable = require "prosody.util.table".create;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
25 local inet = require "prosody.util.net";
9473
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9445
diff changeset
26 local inet_pton = inet.pton;
7737
f93b3083b46b net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents: 7707
diff changeset
27 local _SOCKETINVALID = socket._SOCKETINVALID or -1;
12974
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
28 local new_id = require "prosody.util.id".short;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
29 local xpcall = require "prosody.util.xpcall".xpcall;
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
30 local sslconfig = require "prosody.util.sslconfig";
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
31 local tls_impl = require "prosody.net.tls_luasec";
13440
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
32 local have_signal, signal = pcall(require, "prosody.util.signal");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33
12974
ba409c67353b net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12828
diff changeset
34 local poller = require "prosody.util.poll"
9506
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
35 local EEXIST = poller.EEXIST;
9507
33d21f020b66 net.server_epoll: Ignore ENOENT when deregitering socket
Kim Alvefur <zash@zash.se>
parents: 9506
diff changeset
36 local ENOENT = poller.ENOENT;
9506
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
37
13490
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
38 -- systemd socket activation
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
39 local SD_LISTEN_FDS_START = 3;
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
40 local SD_LISTEN_FDS = tonumber(os.getenv("LISTEN_FDS")) or 0;
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
41
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
42 local inherited_sockets = setmetatable({}, {
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
43 __index = function(t, k)
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
44 local serv_mt = debug.getregistry()["tcp{server}"];
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
45 for i = 1, SD_LISTEN_FDS do
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
46 local serv = socket.tcp();
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
47 if serv:getfd() ~= _SOCKETINVALID then
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
48 -- If LuaSocket allocated a FD for then we can't really close it and it would leak.
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
49 log("error", "LuaSocket not compatible with socket activation. Upgrade LuaSocket or disable socket activation.");
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
50 setmetatable(t, nil);
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
51 break
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
52 end
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
53 serv:setfd(SD_LISTEN_FDS_START + i - 1);
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
54 debug.setmetatable(serv, serv_mt);
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
55 serv:settimeout(0);
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
56 local ip, port = serv:getsockname();
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
57 t[ip .. ":" .. port] = serv;
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
58 if ip == "0.0.0.0" then
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
59 -- LuaSocket treats '*' as an alias for '0.0.0.0'
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
60 t["*:" .. port] = serv;
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
61 end
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
62 end
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
63
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
64 -- Disable lazy-loading mechanism once performed
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
65 setmetatable(t, nil);
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
66 return t[k];
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
67 end;
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
68 });
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
69
9506
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
70 local poll = assert(poller.new());
7601
ce20546d7714 net.server_epoll: Make sure a recent LuaSocket is avaliable
Kim Alvefur <zash@zash.se>
parents: 7600
diff changeset
71
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 local _ENV = nil;
8555
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8552
diff changeset
73 -- luacheck: std none
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74
7657
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
75 local default_config = { __index = {
9665
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
76 -- If a connection is silent for this long, close it unless onreadtimeout says not to
8983
23f66f04e216 net.server: Set default read timeout to 14 minutes (fixes #971)
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
77 read_timeout = 14 * 60;
9665
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
78
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
79 -- How long to wait for a socket to become writable after queuing data to send
9825
5ccce16c6449 net.server_epoll: Increase send_timeout to 3 minutes (to match server_event)
Kim Alvefur <zash@zash.se>
parents: 9824
diff changeset
80 send_timeout = 180;
9665
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
81
9824
729de68f0068 net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents: 9823
diff changeset
82 -- 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: 9823
diff changeset
83 connect_timeout = 20;
9665
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
84
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
85 -- Some number possibly influencing how many pending connections can be accepted
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86 tcp_backlog = 128;
9665
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
87
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
88 -- If accepting a new incoming connection fails, wait this long before trying again
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 accept_retry_interval = 10;
9665
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
90
11671
4e4e26e3df8d net.server_epoll: Fix typo
Kim Alvefur <zash@zash.se>
parents: 11665
diff changeset
91 -- If there is still more data to read from LuaSockets buffer, wait this long and read again
7560
785fa1138293 net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents: 7559
diff changeset
92 read_retry_delay = 1e-06;
9665
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
93
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
94 -- Size of chunks to read from sockets
9311
9b0604fe01f1 net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents: 9310
diff changeset
95 read_size = 8192;
9665
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
96
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
97 -- Timeout used during between steps in TLS handshakes
9822
13c2707d2417 net.server_epoll: Rename handshake_timeout to ssl_handshake_timeout (fixes #1319)
Kim Alvefur <zash@zash.se>
parents: 9821
diff changeset
98 ssl_handshake_timeout = 60;
9665
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
99
4790d1b88919 server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents: 9664
diff changeset
100 -- Maximum and minimum amount of time to sleep waiting for events (adjusted for pending timers)
7623
a1c040a5754f net.server_epoll: Make maximum wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7606
diff changeset
101 max_wait = 86400;
11694
d6be4dda1f60 net.server_epoll: Set minimum wait time to 1ms, matching epoll
Kim Alvefur <zash@zash.se>
parents: 11689
diff changeset
102 min_wait = 0.001;
10081
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10080
diff changeset
103
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
104 -- Enable extra noisy debug logging
12342
cba0b93320b7 net.server_epoll: Disable verbose mode by default
Kim Alvefur <zash@zash.se>
parents: 12110
diff changeset
105 verbose = false;
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
106
10081
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10080
diff changeset
107 -- EXPERIMENTAL
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10080
diff changeset
108 -- 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: 10080
diff changeset
109 fatal_errors = false;
10228
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10098
diff changeset
110
10992
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
111 -- Or disable protection (like server_select) for potential performance gains
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
112 protect_listeners = true;
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
113
10228
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10098
diff changeset
114 -- Attempt writes instantly
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10098
diff changeset
115 opportunistic_writes = false;
11687
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11686
diff changeset
116
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11686
diff changeset
117 -- TCP Keepalives
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11686
diff changeset
118 tcp_keepalive = false; -- boolean | number
11689
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11688
diff changeset
119
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11688
diff changeset
120 -- Whether to let the Nagle algorithm stay enabled
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11688
diff changeset
121 nagle = true;
11696
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11695
diff changeset
122
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11695
diff changeset
123 -- Reuse write buffer tables
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11695
diff changeset
124 keep_buffers = true;
11811
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
125
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
126 --- How long to wait after getting the shutdown signal before forcefully tearing down every socket
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
127 shutdown_deadline = 5;
12512
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12481
diff changeset
128
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12481
diff changeset
129 -- TCP Fast Open
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12481
diff changeset
130 tcp_fastopen = false;
12515
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12514
diff changeset
131
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12514
diff changeset
132 -- Defer accept until incoming data is available
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12514
diff changeset
133 tcp_defer_accept = false;
7657
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
134 }};
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
135 local cfg = default_config.__index;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
136
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
137 local fds = createtable(10, 0); -- FD -> conn
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
138
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
139 -- Timer and scheduling --
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
140
10059
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
141 local timers = indexedbheap.create();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
142
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
143 local function noop() end
11761
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
144
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
145 -- Keep track of recently closed timers to avoid re-adding them
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
146 local closedtimers = {};
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
147
10985
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
148 local function closetimer(id)
11761
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
149 if timers:remove(id) then
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
150 closedtimers[id] = true;
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
151 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
152 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
153
10985
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
154 local function reschedule(id, time)
10492
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10491
diff changeset
155 time = monotonic() + time;
10985
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
156 timers:reprioritize(id, time);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
157 end
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
158
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
159 -- Add relative timer
10982
276f16101d59 net.server_epoll: Make API-compatible with util.timer
Kim Alvefur <zash@zash.se>
parents: 10861
diff changeset
160 local function addtimer(timeout, f, param)
10492
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10491
diff changeset
161 local time = monotonic() + timeout;
10985
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
162 if param ~= nil then
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
163 local timer_callback = f
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
164 function f(current_time, timer_id)
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
165 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: 10984
diff changeset
166 return t;
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
167 end
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
168 end
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
169 local id = timers:insert(f, time);
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
170 return id;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
171 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
172
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
173 -- Run callbacks of expired timers
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
174 -- Return time until next timeout
7658
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7657
diff changeset
175 local function runtimers(next_delay, min_wait)
7629
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7628
diff changeset
176 -- Any timers at all?
10492
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10491
diff changeset
177 local elapsed = monotonic();
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10491
diff changeset
178 local now = realtime();
10059
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
179 local peek = timers:peek();
11262
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
180 local readd;
10059
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
181 while peek do
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
182
10492
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10491
diff changeset
183 if peek > elapsed then
10059
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
184 break;
10681
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10059
diff changeset
185 end
10059
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
186
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
187 local _, timer, id = timers:pop();
10990
03e76ad725b2 net.server_epoll: ... and include a traceback
Kim Alvefur <zash@zash.se>
parents: 10989
diff changeset
188 local ok, ret = xpcall(timer, traceback, now, id);
11761
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
189 if ok and type(ret) == "number" and not closedtimers[id] then
10492
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10491
diff changeset
190 local next_time = elapsed+ret;
11262
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
191 -- Delay insertion of timers to be re-added
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
192 -- so they don't get called again this tick
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
193 if readd then
11264
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11239 11262
diff changeset
194 readd[id] = { timer, next_time };
11262
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
195 else
11264
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11239 11262
diff changeset
196 readd = { [id] = { timer, next_time } };
11262
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
197 end
10989
b824fe9d0c8b net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents: 10987
diff changeset
198 elseif not ok then
b824fe9d0c8b net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents: 10987
diff changeset
199 log("error", "Error in timer: %s", ret);
10681
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10059
diff changeset
200 end
10059
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
201
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
202 peek = timers:peek();
10681
e531273341d3 net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 10059
diff changeset
203 end
11262
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
204
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
205 if readd then
11751
a8c9a78c6a4b net.server_epoll: Fix to preserve ids of readded timers
Kim Alvefur <zash@zash.se>
parents: 11265
diff changeset
206 for id, timer in pairs(readd) do
11752
6427e2642976 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11743 11751
diff changeset
207 timers:insert(timer[1], timer[2], id);
11262
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
208 end
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
209 peek = timers:peek();
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
210 end
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
211
11761
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
212 if next(closedtimers) ~= nil then
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
213 closedtimers = {};
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
214 end
dbf378dcf27b net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents: 11752
diff changeset
215
10059
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
216 if peek == nil then
7629
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7628
diff changeset
217 return next_delay;
11262
2c559953ad41 net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents: 11063
diff changeset
218 else
11264
2cdcf55c6dd5 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 11239 11262
diff changeset
219 next_delay = peek - elapsed;
7629
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7628
diff changeset
220 end
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7628
diff changeset
221
10059
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
222 if next_delay < min_wait then
c8c3f2eba898 net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents: 9994
diff changeset
223 return min_wait;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
224 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
225 return next_delay;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
226 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
227
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
228 -- Socket handler interface
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
229
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
230 local interface = {};
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
231 local interface_mt = { __index = interface };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
232
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
233 function interface_mt:__tostring()
7585
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7584
diff changeset
234 if self.sockname and self.peername then
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7584
diff changeset
235 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: 7584
diff changeset
236 elseif self.sockname or self.peername then
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7584
diff changeset
237 return ("FD %d (%s, %d)"):format(self:getfd(), self.sockname or self.peername, self.sockport or self.peerport);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
238 end
9321
146dc1e4c7ff net.server_epoll: Simplify minimal string representation
Kim Alvefur <zash@zash.se>
parents: 9320
diff changeset
239 return ("FD %d"):format(self:getfd());
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
240 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
241
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
242 interface.log = log;
11497
960674938665 net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 11413
diff changeset
243 function interface:debug(msg, ...)
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
244 self.log("debug", msg, ...);
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
245 end
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
246
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
247 interface.noise = interface.debug;
11497
960674938665 net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 11413
diff changeset
248 function interface:noise(msg, ...)
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
249 if cfg.verbose then
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
250 return self:debug(msg, ...);
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
251 end
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
252 end
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
253
11497
960674938665 net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 11413
diff changeset
254 function interface:error(msg, ...)
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
255 self.log("error", msg, ...);
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
256 end
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
257
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
258 -- Replace the listener and tell the old one
9387
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
259 function interface:setlistener(listeners, data)
7604
36408ef6c8c9 net.server_epoll: Call ondetach when listeners are replaced
Kim Alvefur <zash@zash.se>
parents: 7603
diff changeset
260 self:on("detach");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
261 self.listeners = listeners;
9387
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
262 self:on("attach", data);
7547
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
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
265 -- Call a listener callback
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
266 function interface:on(what, ...)
8006
be374a5778f3 net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents: 7910
diff changeset
267 if not self.listeners then
10589
3540118699cf net.server_epoll: Log error about missing *all* callbacks at 'error' level
Kim Alvefur <zash@zash.se>
parents: 10588
diff changeset
268 self:error("Interface is missing listener callbacks");
8006
be374a5778f3 net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents: 7910
diff changeset
269 return;
be374a5778f3 net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents: 7910
diff changeset
270 end
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
271 local listener = self.listeners["on"..what];
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
272 if not listener then
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
273 self:noise("Missing listener 'on%s'", what); -- uncomment for development and debugging
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
274 return;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
275 end
10992
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
276 if not cfg.protect_listeners then
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
277 return listener(self, ...);
df3ee12acd8c net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents: 10991
diff changeset
278 end
10991
aa85cb5b859f net.server_epoll: Allow setting a custom error handler for listener
Kim Alvefur <zash@zash.se>
parents: 10990
diff changeset
279 local onerror = self.listeners.onerror or traceback;
aa85cb5b859f net.server_epoll: Allow setting a custom error handler for listener
Kim Alvefur <zash@zash.se>
parents: 10990
diff changeset
280 local ok, err = xpcall(listener, onerror, self, ...);
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
281 if not ok then
10081
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10080
diff changeset
282 if cfg.fatal_errors then
10588
ceadf3d3fecf net.server_epoll: Log errors caught in listeners on 'error' level
Kim Alvefur <zash@zash.se>
parents: 10587
diff changeset
283 self:error("Closing due to error calling on%s: %s", what, err);
10081
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10080
diff changeset
284 self:destroy();
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
285 else
11239
06a5919e2496 net.server_epoll: Increase log level for error in callback
Kim Alvefur <zash@zash.se>
parents: 11068
diff changeset
286 self:error("Error calling on%s: %s", what, err);
10081
72adf1f39404 net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents: 10080
diff changeset
287 end
10080
39ca4202ae1e net.server_epoll: Return listener error message
Kim Alvefur <zash@zash.se>
parents: 10061
diff changeset
288 return nil, err;
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
289 end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
290 return err;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
291 end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
292
10278
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10234
diff changeset
293 -- 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: 10234
diff changeset
294 function interface:onincoming(...)
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10234
diff changeset
295 return self:on("incoming", ...);
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10234
diff changeset
296 end
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10234
diff changeset
297
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
298 -- Return the file descriptor number
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
299 function interface:getfd()
7586
846fdbbc62ba net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents: 7585
diff changeset
300 if self.conn then
846fdbbc62ba net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents: 7585
diff changeset
301 return self.conn:getfd();
846fdbbc62ba net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents: 7585
diff changeset
302 end
7737
f93b3083b46b net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents: 7707
diff changeset
303 return _SOCKETINVALID;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
304 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
305
8271
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: 8091
diff changeset
306 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: 8091
diff changeset
307 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: 8091
diff changeset
308 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: 8091
diff changeset
309
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
310 -- Get IP address
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
311 function interface:ip()
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
312 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: 7583
diff changeset
313 end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
314
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
315 -- Get a port number, doesn't matter which
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
316 function interface:port()
11793
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
317 return self.peerport or self.sockport;
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
318 end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
319
11793
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
320 -- Client-side port (usually a random high port)
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
321 function interface:clientport()
11793
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
322 if self._server then
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
323 return self.peerport;
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
324 else
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
325 return self.sockport;
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
326 end
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
327 end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
328
11793
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
329 -- Get port on the server
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
330 function interface:serverport()
11793
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
331 if self._server then
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
332 return self.sockport;
11793
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
333 else
9006ff4838ff net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents: 11761
diff changeset
334 return self.peerport;
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
335 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
336 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
337
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
338 -- Return underlying socket
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
339 function interface:socket()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
340 return self.conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
341 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
342
7910
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7817
diff changeset
343 function interface:set_mode(new_mode)
9310
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
344 self.read_size = new_mode;
7910
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7817
diff changeset
345 end
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7817
diff changeset
346
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
347 function interface:setoption(k, v)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
348 -- LuaSec doesn't expose setoption :(
11685
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
349 local ok, ret, err = pcall(self.conn.setoption, self.conn, k, v);
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
350 if not ok then
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
351 self:noise("Setting option %q = %q failed: %s", k, v, ret);
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
352 return ok, ret;
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
353 elseif not ret then
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
354 self:noise("Setting option %q = %q failed: %s", k, v, err);
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
355 return ret, err;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
356 end
11685
247561bf6fca net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents: 11677
diff changeset
357 return ret;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
358 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
359
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
360 -- Timeout for detecting dead or idle sockets
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
361 function interface:setreadtimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
362 if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
363 if self._readtimeout then
10985
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
364 closetimer(self._readtimeout);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
365 self._readtimeout = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
366 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
367 return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
368 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
369 t = t or cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
370 if self._readtimeout then
10985
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
371 reschedule(self._readtimeout, t);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
372 else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
373 self._readtimeout = addtimer(t, function ()
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
374 if self:on("readtimeout") then
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
375 self:noise("Read timeout handled");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
376 return cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
377 else
10417
d8a0b0d21c81 net.server_epoll: Improve read timeout debug messages
Kim Alvefur <zash@zash.se>
parents: 10416
diff changeset
378 self:debug("Read timeout not handled, disconnecting");
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
379 self:on("disconnect", "read timeout");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
380 self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
381 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
382 end);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
383 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
384 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
385
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
386 -- Timeout for detecting dead sockets
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
387 function interface:setwritetimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
388 if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
389 if self._writetimeout then
10985
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
390 closetimer(self._writetimeout);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
391 self._writetimeout = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
392 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
393 return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
394 end
9821
7712488c8e49 net.server_epoll: Use send_timeout for write timout like other implementations (fixes #1316)
Kim Alvefur <zash@zash.se>
parents: 9665
diff changeset
395 t = t or cfg.send_timeout;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
396 if self._writetimeout then
10985
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
397 reschedule(self._writetimeout, t);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
398 else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
399 self._writetimeout = addtimer(t, function ()
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
400 self:noise("Write timeout");
10638
92918212ee83 net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents: 10589
diff changeset
401 self:on("disconnect", self._connected and "write timeout" or "connection timeout");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
402 self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
403 end);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
404 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
405 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
406
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
407 function interface:add(r, w)
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
408 local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
409 if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
410 return nil, "invalid fd";
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
411 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
412 if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
413 if w == nil then w = self._wantwrite; end
9384
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9383
diff changeset
414 local ok, err, errno = poll:add(fd, r, w);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
415 if not ok then
9506
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
416 if errno == EEXIST then
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
417 self:debug("FD already registered in poller! (EEXIST)");
9506
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
418 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: 9499
diff changeset
419 end
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
420 self:debug("Could not register in poller: %s(%d)", err, errno);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
421 return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
422 end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
423 self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
424 fds[fd] = self;
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
425 self:noise("Registered in poller");
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
426 return true;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
427 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
428
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
429 function interface:set(r, w)
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
430 local fd = self:getfd();
7602
a4d5eec36a17 net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents: 7601
diff changeset
431 if fd < 0 then
a4d5eec36a17 net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents: 7601
diff changeset
432 return nil, "invalid fd";
a4d5eec36a17 net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents: 7601
diff changeset
433 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
434 if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
435 if w == nil then w = self._wantwrite; end
13336
f91761822420 net.server_epoll: Avoid call to update socket watch flags when nothing changed
Kim Alvefur <zash@zash.se>
parents: 12974
diff changeset
436 if r == self._wantread and w == self._wantwrite then
f91761822420 net.server_epoll: Avoid call to update socket watch flags when nothing changed
Kim Alvefur <zash@zash.se>
parents: 12974
diff changeset
437 return true
f91761822420 net.server_epoll: Avoid call to update socket watch flags when nothing changed
Kim Alvefur <zash@zash.se>
parents: 12974
diff changeset
438 end
9384
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9383
diff changeset
439 local ok, err, errno = poll:set(fd, r, w);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
440 if not ok then
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
441 self:debug("Could not update poller state: %s(%d)", err, errno);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
442 return ok, err;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
443 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
444 self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
445 return true;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
446 end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
447
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
448 function interface:del()
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
449 local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
450 if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
451 return nil, "invalid fd";
7625
6afafd6d4ef0 net.server_epoll: Move management of fd registry to :setflags
Kim Alvefur <zash@zash.se>
parents: 7624
diff changeset
452 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
453 if fds[fd] ~= self then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
454 return nil, "unregistered fd";
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
455 end
9384
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9383
diff changeset
456 local ok, err, errno = poll:del(fd);
9507
33d21f020b66 net.server_epoll: Ignore ENOENT when deregitering socket
Kim Alvefur <zash@zash.se>
parents: 9506
diff changeset
457 if not ok and errno ~= ENOENT then
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
458 self:debug("Could not unregister: %s(%d)", err, errno);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
459 return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
460 end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
461 self._wantread, self._wantwrite = nil, nil;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
462 fds[fd] = nil;
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
463 self:noise("Unregistered from poller");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
464 return true;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
465 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
466
9320
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
467 function interface:setflags(r, w)
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
468 if not(self._wantread or self._wantwrite) then
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
469 if not(r or w) then
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
470 return true; -- no change
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
471 end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
472 return self:add(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
473 end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
474 if not(r or w) then
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
475 return self:del();
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
476 end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
477 return self:set(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
478 end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
479
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
480 -- Called when socket is readable
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
481 function interface:onreadable()
9311
9b0604fe01f1 net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents: 9310
diff changeset
482 local data, err, partial = self.conn:receive(self.read_size or cfg.read_size);
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
483 if data then
8540
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8507
diff changeset
484 self:onconnect();
10278
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10234
diff changeset
485 self:onincoming(data);
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
486 else
9931
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9822
diff changeset
487 if err == "wantread" then
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9822
diff changeset
488 self:set(true, nil);
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9822
diff changeset
489 err = "timeout";
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9822
diff changeset
490 elseif err == "wantwrite" then
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9822
diff changeset
491 self:set(nil, true);
11702
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11701
diff changeset
492 self:setwritetimeout();
9931
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9822
diff changeset
493 err = "timeout";
11592
64cfa396bb84 net.server_epoll: Fix reporting of socket connect timeout
Kim Alvefur <zash@zash.se>
parents: 11497
diff changeset
494 elseif err == "timeout" and not self._connected then
64cfa396bb84 net.server_epoll: Fix reporting of socket connect timeout
Kim Alvefur <zash@zash.se>
parents: 11497
diff changeset
495 err = "connection timeout";
9931
485231f8b75d net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents: 9822
diff changeset
496 end
8540
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8507
diff changeset
497 if partial and partial ~= "" then
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8507
diff changeset
498 self:onconnect();
10278
94c584d67533 net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents: 10234
diff changeset
499 self:onincoming(partial, err);
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
500 end
11814
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11813
diff changeset
501 if err == "closed" and self._connected then
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11813
diff changeset
502 self:debug("Connection closed by remote");
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11813
diff changeset
503 self:close(err);
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11813
diff changeset
504 return;
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11813
diff changeset
505 elseif err ~= "timeout" then
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11813
diff changeset
506 self:debug("Read error, closing (%s)", err);
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
507 self:on("disconnect", err);
11814
f27b9319e0da net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents: 11813
diff changeset
508 self:destroy();
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
509 return;
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
510 end
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
511 end
7691
a5ad858f3a93 net.server_epoll: Check that connection still exists after callback, fixes traceback when closed
Kim Alvefur <zash@zash.se>
parents: 7687
diff changeset
512 if not self.conn then return; end
10098
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
513 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: 10091
diff changeset
514 local cost = self._limit * #(data or partial);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
515 if cost > cfg.min_wait then
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
516 self:setreadtimeout(false);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
517 self:pausefor(cost);
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
518 return;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
519 end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
520 end
11701
a3572205c5bf net.server_epoll: Skip reset of read timeout when not reading
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
521 if not self._wantread then return end
a3572205c5bf net.server_epoll: Skip reset of read timeout when not reading
Kim Alvefur <zash@zash.se>
parents: 11700
diff changeset
522 if self.conn:dirty() then
7606
f40f1d9b7872 net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents: 7604
diff changeset
523 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: 7604
diff changeset
524 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: 7604
diff changeset
525 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: 7604
diff changeset
526 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: 7604
diff changeset
527 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
528 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
529
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
530 -- Called when socket is writable
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
531 function interface:onwritable()
11920
ff4e34c448a4 net.server_epoll: Try harder to avoid reentrant opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11858
diff changeset
532 self._writing = true; -- prevent reentrant writes etc
8552
1fcefc16a55d server_epoll: Onconnect should happen before first attempt to write to socket
Kim Alvefur <zash@zash.se>
parents: 8542
diff changeset
533 self:onconnect();
12011
9dc36fdbdba1 net.server_epoll: Ensure calls to :write() return something
Kim Alvefur <zash@zash.se>
parents: 11972
diff changeset
534 if not self.conn then return nil, "no-conn"; end -- could have been closed in onconnect
11741
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11738
diff changeset
535 self:on("predrain");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
536 local buffer = self.writebuffer;
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
537 local data = buffer or "";
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
538 if type(buffer) == "table" then
11698
9a2a98621c73 net.server_epoll: Optimize concatenation of exactly 2 buffer chunks
Kim Alvefur <zash@zash.se>
parents: 11697
diff changeset
539 if buffer[3] then
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
540 data = t_concat(data);
11698
9a2a98621c73 net.server_epoll: Optimize concatenation of exactly 2 buffer chunks
Kim Alvefur <zash@zash.se>
parents: 11697
diff changeset
541 elseif buffer[2] then
9a2a98621c73 net.server_epoll: Optimize concatenation of exactly 2 buffer chunks
Kim Alvefur <zash@zash.se>
parents: 11697
diff changeset
542 data = buffer[1] .. buffer[2];
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
543 else
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
544 data = buffer[1] or "";
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
545 end
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
546 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
547 local ok, err, partial = self.conn:send(data);
11738
3f1450ec37f4 net.server_epoll: Improve efficiency of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11703
diff changeset
548 self._writable = ok;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
549 if ok then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
550 self:set(nil, false);
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
551 if cfg.keep_buffers and type(buffer) == "table" then
11805
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
552 for i = #buffer, 1, -1 do
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
553 buffer[i] = nil;
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
554 end
11696
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11695
diff changeset
555 else
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11695
diff changeset
556 self.writebuffer = nil;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
557 end
11922
28f5c8061dad net.server_epoll: Fix streaming downloads (thanks Menel)
Kim Alvefur <zash@zash.se>
parents: 11920
diff changeset
558 self._writing = nil;
8541
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: 8540
diff changeset
559 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: 8540
diff changeset
560 self:ondrain(); -- Be aware of writes in ondrain
11695
1573099157c9 net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11694
diff changeset
561 return ok;
8540
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8507
diff changeset
562 elseif partial then
10305
2fadbf209678 net.server_epoll: Log size of partial writes (debug)
Kim Alvefur <zash@zash.se>
parents: 10300
diff changeset
563 self:debug("Sent %d out of %d buffered bytes", partial, #data);
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
564 if cfg.keep_buffers and type(buffer) == "table" then
11805
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
565 buffer[1] = data:sub(partial+1);
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
566 for i = #buffer, 2, -1 do
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
567 buffer[i] = nil;
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
568 end
11696
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11695
diff changeset
569 else
11703
e57c5d9c722c net.server_epoll: Fix traceback-causing typo
Kim Alvefur <zash@zash.se>
parents: 11702
diff changeset
570 self.writebuffer = data:sub(partial+1);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
571 end
10228
e77bf4222fae net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 10098
diff changeset
572 self:set(nil, true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
573 self:setwritetimeout();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
574 end
11920
ff4e34c448a4 net.server_epoll: Try harder to avoid reentrant opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11858
diff changeset
575 self._writing = nil;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
576 if err == "wantwrite" or err == "timeout" then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
577 self:set(nil, true);
11702
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11701
diff changeset
578 self:setwritetimeout();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
579 elseif err == "wantread" then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
580 self:set(true, nil);
11702
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11701
diff changeset
581 self:setreadtimeout();
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
582 elseif err ~= "timeout" then
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
583 self:on("disconnect", err);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
584 self:destroy();
11695
1573099157c9 net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11694
diff changeset
585 return ok, err;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
586 end
12011
9dc36fdbdba1 net.server_epoll: Ensure calls to :write() return something
Kim Alvefur <zash@zash.se>
parents: 11972
diff changeset
587 return true, err;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
588 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
589
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
590 -- The write buffer has been successfully emptied
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
591 function interface:ondrain()
8008
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8007
diff changeset
592 return self:on("drain");
7547
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
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
595 -- Add data to write buffer and set flag for wanting to write
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
596 function interface:write(data)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
597 local buffer = self.writebuffer;
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
598 if type(buffer) == "table" then
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
599 t_insert(buffer, data);
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
600 elseif type(buffer) == "string" then
11696
917eca7be82b net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents: 11695
diff changeset
601 self:noise("Allocating buffer!")
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
602 self.writebuffer = { buffer, data };
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
603 elseif buffer == nil then
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
604 self.writebuffer = data;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
605 end
11920
ff4e34c448a4 net.server_epoll: Try harder to avoid reentrant opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11858
diff changeset
606 if not self._write_lock and not self._writing then
11738
3f1450ec37f4 net.server_epoll: Improve efficiency of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11703
diff changeset
607 if self._writable and cfg.opportunistic_writes and not self._opportunistic_write then
11665
148075532021 net.server_epoll: Prevent stack overflow of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11660
diff changeset
608 self._opportunistic_write = true;
11695
1573099157c9 net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11694
diff changeset
609 local ret, err = self:onwritable();
11665
148075532021 net.server_epoll: Prevent stack overflow of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11660
diff changeset
610 self._opportunistic_write = nil;
11695
1573099157c9 net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11694
diff changeset
611 return ret, err;
11805
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
612 end
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
613 self:setwritetimeout();
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
614 self:set(nil, true);
9581
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
615 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
616 return #data;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
617 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
618 interface.send = interface.write;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
619
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
620 -- Close, possibly after writing is done
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
621 function interface:close()
11813
790bffbb9047 net.server_epoll: Skip attempt to flush write buffer when not connected
Kim Alvefur <zash@zash.se>
parents: 11812
diff changeset
622 if self._connected and self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then
11972
520ce76440ad net.server_epoll: Prevent loop attempting to send last data after close
Kim Alvefur <zash@zash.se>
parents: 11922
diff changeset
623 self._connected = false;
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
624 self:set(false, true); -- Flush final buffer contents
11702
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11701
diff changeset
625 self:setreadtimeout(false);
11658
36942fa001b4 net.server_epoll: Ensure timeout after closing
Kim Alvefur <zash@zash.se>
parents: 11595
diff changeset
626 self:setwritetimeout();
7593
0266434d7df1 net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents: 7592
diff changeset
627 self.write, self.send = noop, noop; -- No more writing
10416
6af8c812a885 net.server_epoll: Clarify a debug message
Kim Alvefur <zash@zash.se>
parents: 10332
diff changeset
628 self:debug("Close after writing remaining buffered data");
8008
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8007
diff changeset
629 self.ondrain = interface.close;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
630 else
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
631 self:debug("Closing now");
7593
0266434d7df1 net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents: 7592
diff changeset
632 self.write, self.send = noop, noop;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
633 self.close = noop;
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
634 self:on("disconnect");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
635 self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
636 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
637 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
638
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
639 function interface:destroy()
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
640 self:del();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
641 self:setwritetimeout(false);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
642 self:setreadtimeout(false);
7594
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
643 self.onreadable = noop;
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
644 self.onwritable = noop;
7594
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
645 self.destroy = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
646 self.close = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
647 self.on = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
648 self.conn:close();
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
649 self.conn = nil;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
650 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
651
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
652 function interface:ssl()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
653 return self._tls;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
654 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
655
11595
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11592
diff changeset
656 function interface:set_sslctx(sslctx)
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11592
diff changeset
657 self._sslctx = sslctx;
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11592
diff changeset
658 end
8985efc6792d net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents: 11592
diff changeset
659
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
660 function interface:sslctx()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
661 return self.tls_ctx
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
662 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
663
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
664 function interface:ssl_info()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
665 local sock = self.conn;
13422
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13336
diff changeset
666 if not sock then return nil, "not-connected" end
12542
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12515
diff changeset
667 if not sock.info then return nil, "not-implemented"; end
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12515
diff changeset
668 return sock:info();
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
669 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
670
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
671 function interface:ssl_peercertificate()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
672 local sock = self.conn;
13422
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13336
diff changeset
673 if not sock then return nil, "not-connected" end
12542
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12515
diff changeset
674 if not sock.getpeercertificate then return nil, "not-implemented"; end
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12515
diff changeset
675 return sock:getpeercertificate();
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
676 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
677
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
678 function interface:ssl_peerverification()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
679 local sock = self.conn;
13422
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13336
diff changeset
680 if not sock then return nil, "not-connected" end
12542
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12515
diff changeset
681 if not sock.getpeerverification then return nil, { { "Chain verification not supported" } }; end
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12515
diff changeset
682 return sock:getpeerverification();
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
683 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
684
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
685 function interface:ssl_peerfinished()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
686 local sock = self.conn;
13422
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13336
diff changeset
687 if not sock then return nil, "not-connected" end
12542
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12515
diff changeset
688 if not sock.getpeerfinished then return nil, "not-implemented"; end
5ec9d6913162 net.server: Fix multiple return values
Kim Alvefur <zash@zash.se>
parents: 12515
diff changeset
689 return sock:getpeerfinished();
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
690 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
691
12594
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
692 function interface:ssl_exportkeyingmaterial(label, len, context)
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
693 local sock = self.conn;
13422
3c80124452ed net.server_epoll: Prevent traceback when checking TLS after connection gone
Kim Alvefur <zash@zash.se>
parents: 13336
diff changeset
694 if not sock then return nil, "not-connected" end
12594
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
695 if sock.exportkeyingmaterial then
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
696 return sock:exportkeyingmaterial(label, len, context);
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
697 end
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
698 end
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
699
29685403be32 mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents: 12542
diff changeset
700
9300
1df8832bd29e net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
701 function interface:starttls(tls_ctx)
1df8832bd29e net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
702 if tls_ctx then self.tls_ctx = tls_ctx; end
9430
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
703 self.starttls = false;
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
704 if self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
705 self:debug("Start TLS after write");
8008
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8007
diff changeset
706 self.ondrain = interface.starttls;
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
707 self:set(nil, true); -- make sure wantwrite is set
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
708 else
9430
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
709 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: 9387
diff changeset
710 self.ondrain = nil;
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
711 end
11672
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
712 self.onwritable = interface.inittls;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
713 self.onreadable = interface.inittls;
9430
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
714 self:set(true, true);
11699
1275dad71afd net.server_epoll: Use only fatal "write" timeout during TLS negotiation
Kim Alvefur <zash@zash.se>
parents: 11698
diff changeset
715 self:setreadtimeout(false);
11659
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11658
diff changeset
716 self:setwritetimeout(cfg.ssl_handshake_timeout);
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
717 self:debug("Prepared to start TLS");
9430
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
718 end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
719 end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
720
11676
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
721 function interface:inittls(tls_ctx, now)
11672
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
722 if self._tls then return end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
723 if tls_ctx then self.tls_ctx = tls_ctx; end
11805
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
724 self._tls = true;
11839
19b50ce9ef5a net.server_epoll: Prevent starttls on direct TLS connections
Kim Alvefur <zash@zash.se>
parents: 11814
diff changeset
725 self.starttls = false;
11672
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
726 self:debug("Starting TLS now");
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
727 self:updatenames(); -- Can't getpeer/sockname after wrap()
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
728 local conn, err = self.tls_ctx:wrap(self.conn);
11805
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
729 if not conn then
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
730 self:on("disconnect", err);
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
731 self:destroy();
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
732 return conn, err;
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
733 end
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
734 conn:settimeout(0);
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
735 self.conn = conn;
11672
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
736 if conn.sni then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
737 if self.servername then
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
738 conn:sni(self.servername);
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
739 elseif next(self.tls_ctx._sni_contexts) ~= nil then
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12342
diff changeset
740 conn:sni(self.tls_ctx._sni_contexts, true);
9431
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9430
diff changeset
741 end
11672
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
742 end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
743 if self.extra and self.extra.tlsa and conn.settlsa then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
744 -- TODO Error handling
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
745 if not conn:setdane(self.servername or self.extra.dane_hostname) then
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
746 self:debug("Could not enable DANE on connection");
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
747 else
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
748 self:debug("Enabling DANE with %d TLSA records", #self.extra.tlsa);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
749 self:noise("DANE hostname is %q", self.servername or self.extra.dane_hostname);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
750 for _, tlsa in ipairs(self.extra.tlsa) do
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
751 self:noise("TLSA: %q", tlsa);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
752 conn:settlsa(tlsa.use, tlsa.select, tlsa.match, tlsa.data);
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
753 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
754 end
11805
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
755 end
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
756 self:on("starttls");
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
757 self.ondrain = nil;
11672
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
758 self.onwritable = interface.tlshandshake;
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
759 self.onreadable = interface.tlshandshake;
11676
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
760 if now then
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
761 return self:tlshandshake()
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
762 end
11699
1275dad71afd net.server_epoll: Use only fatal "write" timeout during TLS negotiation
Kim Alvefur <zash@zash.se>
parents: 11698
diff changeset
763 self:setreadtimeout(false);
11674
8253f6a30afc net.server_epoll: Use TLS handshake timeout after initiating handshake
Kim Alvefur <zash@zash.se>
parents: 11673
diff changeset
764 self:setwritetimeout(cfg.ssl_handshake_timeout);
11675
139d80774f11 net.server_epoll: Keep socket registered in epoll trough TLS wrapping
Kim Alvefur <zash@zash.se>
parents: 11674
diff changeset
765 self:set(true, true);
11672
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
766 end
79f8e29e88a0 net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents: 11671
diff changeset
767
10847
42c8dce6e765 net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents: 10846
diff changeset
768 function interface:tlshandshake()
9430
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
769 self:setreadtimeout(false);
10846
d0b098d0f6c3 net.server_epoll: Log some noise before TLS handshake step
Kim Alvefur <zash@zash.se>
parents: 10683
diff changeset
770 self:noise("Continuing TLS handshake");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
771 local ok, err = self.conn:dohandshake();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
772 if ok then
10309
2a31571efce0 net.server_epoll: Guard against nil return from TLS info method
Kim Alvefur <zash@zash.se>
parents: 10307
diff changeset
773 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: 10307
diff changeset
774 if type(info) == "table" then
10307
6a997f0ceba8 net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents: 10305
diff changeset
775 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: 10305
diff changeset
776 else
6a997f0ceba8 net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents: 10305
diff changeset
777 self:debug("TLS handshake complete");
6a997f0ceba8 net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents: 10305
diff changeset
778 end
11700
79d30de13fdb net.server_epoll: Reduce timer churn during TLS handshake
Kim Alvefur <zash@zash.se>
parents: 11699
diff changeset
779 self:setwritetimeout(false);
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
780 self.onwritable = nil;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
781 self.onreadable = nil;
8008
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8007
diff changeset
782 self:on("status", "ssl-handshake-complete");
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
783 self:set(true, true);
11677
98bcc19361db net.server_epoll: Call onconnect immediately after TLS handshake completion
Kim Alvefur <zash@zash.se>
parents: 11676
diff changeset
784 self:onconnect();
98bcc19361db net.server_epoll: Call onconnect immediately after TLS handshake completion
Kim Alvefur <zash@zash.se>
parents: 11676
diff changeset
785 self:onreadable();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
786 elseif err == "wantread" then
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
787 self:noise("TLS handshake to wait until readable");
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
788 self:set(true, false);
11699
1275dad71afd net.server_epoll: Use only fatal "write" timeout during TLS negotiation
Kim Alvefur <zash@zash.se>
parents: 11698
diff changeset
789 self:setwritetimeout(cfg.ssl_handshake_timeout);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
790 elseif err == "wantwrite" then
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
791 self:noise("TLS handshake to wait until writable");
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
792 self:set(false, true);
9822
13c2707d2417 net.server_epoll: Rename handshake_timeout to ssl_handshake_timeout (fixes #1319)
Kim Alvefur <zash@zash.se>
parents: 9821
diff changeset
793 self:setwritetimeout(cfg.ssl_handshake_timeout);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
794 else
10649
228277be4a28 net.server_epoll: Reduce log level of TLS handshake errors to debug
Kim Alvefur <zash@zash.se>
parents: 10638
diff changeset
795 self:debug("TLS handshake error: %s", err);
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
796 self:on("disconnect", err);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
797 self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
798 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
799 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
800
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
801 local function wrapsocket(client, server, read_size, listeners, tls_ctx, extra) -- luasocket object -> interface object
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
802 client:settimeout(0);
10279
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10278
diff changeset
803 local conn_id = ("conn%s"):format(new_id());
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
804 local conn = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
805 conn = client;
8271
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: 8091
diff changeset
806 _server = server;
10492
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10491
diff changeset
807 created = realtime();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
808 listeners = listeners;
9310
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
809 read_size = read_size or (server and server.read_size);
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
810 writebuffer = nil;
9432
2e3f66475cc8 net.server_epoll: Inherit Direct TLS flag from servers to their clients
Kim Alvefur <zash@zash.se>
parents: 9431
diff changeset
811 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: 9431
diff changeset
812 tls_direct = server and server.tls_direct;
10279
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10278
diff changeset
813 id = conn_id;
0e1701197722 net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents: 10278
diff changeset
814 log = logger.init(conn_id);
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
815 extra = extra;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
816 }, interface_mt);
7591
138f16eb39fb net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents: 7590
diff changeset
817
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
818 if extra then
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
819 if extra.servername then
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
820 conn.servername = extra.servername;
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
821 end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
822 end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
823
9383
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
824 return conn;
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
825 end
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
826
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
827 function interface:updatenames()
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
828 local conn = self.conn;
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
829 local ok, peername, peerport = pcall(conn.getpeername, conn);
10330
d86b1304451a net.server_epoll: Handle getpeer/sockname returning a normal error
Kim Alvefur <zash@zash.se>
parents: 10329
diff changeset
830 if ok and peername then
10854
472fe13a05f9 net.server_epoll: Handle missing ports from getsock/peername (as in the case of unix sockets)
Matthew Wild <mwild1@gmail.com>
parents: 10847
diff changeset
831 self.peername, self.peerport = peername, peerport or 0;
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
832 end
9383
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
833 local ok, sockname, sockport = pcall(conn.getsockname, conn);
10330
d86b1304451a net.server_epoll: Handle getpeer/sockname returning a normal error
Kim Alvefur <zash@zash.se>
parents: 10329
diff changeset
834 if ok and sockname then
10854
472fe13a05f9 net.server_epoll: Handle missing ports from getsock/peername (as in the case of unix sockets)
Matthew Wild <mwild1@gmail.com>
parents: 10847
diff changeset
835 self.sockname, self.sockport = sockname, sockport or 0;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
836 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
837 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
838
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
839 -- A server interface has new incoming connections waiting
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
840 -- This replaces the onreadable callback
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
841 function interface:onacceptable()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
842 local conn, err = self.conn:accept();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
843 if not conn then
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
844 self:debug("Error accepting new client: %s, server will be paused for %ds", err, cfg.accept_retry_interval);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
845 self:pausefor(cfg.accept_retry_interval);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
846 return;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
847 end
9309
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
848 local client = wrapsocket(conn, self, nil, self.listeners);
12513
6efbcd52db21 net.server_epoll: Move call to refresh remote IP address out of wrapper
Kim Alvefur <zash@zash.se>
parents: 12512
diff changeset
849 client:updatenames();
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
850 client:debug("New connection %s on server %s", client, self);
11686
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11685
diff changeset
851 client:defaultoptions();
11738
3f1450ec37f4 net.server_epoll: Improve efficiency of opportunistic writes
Kim Alvefur <zash@zash.se>
parents: 11703
diff changeset
852 client._writable = cfg.opportunistic_writes;
9309
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
853 if self.tls_direct then
11659
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11658
diff changeset
854 client:add(true, true);
11676
993462e5e4d4 net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents: 11675
diff changeset
855 client:inittls(self.tls_ctx, true);
9695
5ec4eaf76de8 net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents: 9666
diff changeset
856 else
11659
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11658
diff changeset
857 client:add(true, false);
9695
5ec4eaf76de8 net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents: 9666
diff changeset
858 client:onconnect();
11660
68f0196ece2a net.server_epoll: Immediately attempt to read from newly accepted connections
Kim Alvefur <zash@zash.se>
parents: 11659
diff changeset
859 client:onreadable();
9309
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
860 end
7597
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
861 end
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
862
11659
00295a8e5bcf net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents: 11658
diff changeset
863 -- Initialization for outgoing connections
7597
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
864 function interface:init()
9824
729de68f0068 net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents: 9823
diff changeset
865 self:setwritetimeout(cfg.connect_timeout);
11686
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11685
diff changeset
866 self:defaultoptions();
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
867 return self:add(true, true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
868 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
869
11686
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11685
diff changeset
870 function interface:defaultoptions()
11689
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11688
diff changeset
871 if cfg.nagle == false then
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11688
diff changeset
872 self:setoption("tcp-nodelay", true);
f9f6e82fb572 net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents: 11688
diff changeset
873 end
11687
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11686
diff changeset
874 if cfg.tcp_keepalive then
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11686
diff changeset
875 self:setoption("keepalive", true);
11688
3fc564f7441b net.server_epoll: Support setting keepalive idle time
Kim Alvefur <zash@zash.se>
parents: 11687
diff changeset
876 if type(cfg.tcp_keepalive) == "number" then
3fc564f7441b net.server_epoll: Support setting keepalive idle time
Kim Alvefur <zash@zash.se>
parents: 11687
diff changeset
877 self:setoption("tcp-keepidle", cfg.tcp_keepalive);
3fc564f7441b net.server_epoll: Support setting keepalive idle time
Kim Alvefur <zash@zash.se>
parents: 11687
diff changeset
878 end
11687
153d2fdd97d3 net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents: 11686
diff changeset
879 end
11686
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11685
diff changeset
880 end
f4c3dcc907d8 net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents: 11685
diff changeset
881
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
882 function interface:pause()
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
883 self:noise("Pause reading");
11702
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11701
diff changeset
884 self:setreadtimeout(false);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
885 return self:set(false);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
886 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
887
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
888 function interface:resume()
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
889 self:noise("Resume reading");
11702
c206430e2643 net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents: 11701
diff changeset
890 self:setreadtimeout();
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
891 return self:set(true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
892 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
893
7624
23fb3a084956 net.server_epoll: Comments
Kim Alvefur <zash@zash.se>
parents: 7623
diff changeset
894 -- Pause connection for some time
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
895 function interface:pausefor(t)
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
896 self:noise("Pause for %fs", t);
7559
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
897 if self._pausefor then
10985
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
898 closetimer(self._pausefor);
758ce12586de net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents: 10984
diff changeset
899 self._pausefor = nil;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
900 end
7559
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
901 if t == false then return; end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
902 self:set(false);
7559
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
903 self._pausefor = addtimer(t, function ()
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
904 self._pausefor = nil;
9994
524b8cd76780 net.server_epoll: Restore wantread flag after pause (fixes #1354)
Kim Alvefur <zash@zash.se>
parents: 9932
diff changeset
905 self:set(true);
11743
856dada099fa net.server_epoll: Split, attempt to clarify dirty noise message
Kim Alvefur <zash@zash.se>
parents: 11741
diff changeset
906 self:noise("Resuming after pause");
7707
7bb1cc7278b6 net.server_epoll: Make sure socket exists before checking if there is buffered data in it
Kim Alvefur <zash@zash.se>
parents: 7691
diff changeset
907 if self.conn and self.conn:dirty() then
11743
856dada099fa net.server_epoll: Split, attempt to clarify dirty noise message
Kim Alvefur <zash@zash.se>
parents: 11741
diff changeset
908 self:noise("Have buffered incoming data to process");
7560
785fa1138293 net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents: 7559
diff changeset
909 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: 7559
diff changeset
910 end
7559
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
911 end);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
912 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
913
10098
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
914 function interface:setlimit(Bps)
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
915 if Bps > 0 then
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
916 self._limit = 1/Bps;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
917 else
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
918 self._limit = nil;
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
919 end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
920 end
dda1c7ccb209 server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents: 10091
diff changeset
921
9581
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
922 function interface:pause_writes()
10300
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10289
diff changeset
923 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: 10289
diff changeset
924 return
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10289
diff changeset
925 end
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
926 self:noise("Pause writes");
9581
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
927 self._write_lock = true;
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
928 self:setwritetimeout(false);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
929 self:set(nil, false);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
930 end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
931
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
932 function interface:resume_writes()
10300
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10289
diff changeset
933 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: 10289
diff changeset
934 return
78f2a3a9c537 net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents: 10289
diff changeset
935 end
10587
863aa36a9dd8 net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents: 10586
diff changeset
936 self:noise("Resume writes");
9581
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
937 self._write_lock = nil;
11697
6c3d8aa3bbd9 net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents: 11696
diff changeset
938 if self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then
9581
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
939 self:setwritetimeout();
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
940 self:set(nil, true);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
941 end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
942 end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9573
diff changeset
943
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
944 -- Connected!
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
945 function interface:onconnect()
10638
92918212ee83 net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents: 10589
diff changeset
946 self._connected = true;
9594
dcf466e04f81 net.server_epoll: Use method to update peername on connect
Kim Alvefur <zash@zash.se>
parents: 9587
diff changeset
947 self:updatenames();
10331
76bd77ad6a2a server_epoll: Log full string represestation when connected
Kim Alvefur <zash@zash.se>
parents: 10330
diff changeset
948 self:debug("Connected (%s)", self);
8540
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8507
diff changeset
949 self.onconnect = noop;
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8507
diff changeset
950 self:on("connect");
8506
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8271
diff changeset
951 end
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8271
diff changeset
952
10861
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10854
diff changeset
953 local function wrapserver(conn, addr, port, listeners, config)
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
954 local server = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
955 conn = conn;
10492
8e1d9bba9244 net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents: 10491
diff changeset
956 created = realtime();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
957 listeners = listeners;
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
958 read_size = config and config.read_size;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
959 onreadable = interface.onacceptable;
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
960 tls_ctx = config and config.tls_ctx;
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
961 tls_direct = config and config.tls_direct;
9847
adc0672b700e net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
962 hosts = config and config.sni_hosts;
7584
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
963 sockname = addr;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
964 sockport = port;
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
965 log = logger.init(("serv%s"):format(new_id()));
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
966 }, interface_mt);
10089
90e459f48cbd net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents: 10088
diff changeset
967 server:debug("Server %s created", server);
12512
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12481
diff changeset
968 if cfg.tcp_fastopen then
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12481
diff changeset
969 server:setoption("tcp-fastopen", cfg.tcp_fastopen);
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12481
diff changeset
970 end
12515
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12514
diff changeset
971 if type(cfg.tcp_defer_accept) == "number" then
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12514
diff changeset
972 server:setoption("tcp-defer-accept", cfg.tcp_defer_accept);
76c1725f4467 net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents: 12514
diff changeset
973 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
974 server:add(true, false);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
975 return server;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
976 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
977
10861
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10854
diff changeset
978 local function listen(addr, port, listeners, config)
13490
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
979 local inherited = inherited_sockets[addr .. ":" .. port];
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
980 if inherited then
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
981 local conn = wrapserver(inherited, addr, port, listeners, config);
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
982 -- sockets created by systemd must not be :close() since we may not have
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
983 -- privileges to create them
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
984 conn.destroy = interface.del;
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
985 return conn;
6f840763fc73 net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents: 13450
diff changeset
986 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
987 local conn, err = socket.bind(addr, port, cfg.tcp_backlog);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
988 if not conn then return conn, err; end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
989 conn:settimeout(0);
10861
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10854
diff changeset
990 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: 10854
diff changeset
991 end
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10854
diff changeset
992
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
993 -- COMPAT
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
994 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: 9825
diff changeset
995 return listen(addr, port, listeners, {
9310
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
996 read_size = read_size;
9300
1df8832bd29e net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
997 tls_ctx = tls_ctx;
9309
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
998 tls_direct = tls_ctx and true or false;
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
999 });
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1000 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1001
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1002 -- COMPAT
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
1003 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx, extra)
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
1004 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra);
12513
6efbcd52db21 net.server_epoll: Move call to refresh remote IP address out of wrapper
Kim Alvefur <zash@zash.se>
parents: 12512
diff changeset
1005 client:updatenames();
7597
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
1006 if not client.peername then
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
1007 client.peername, client.peerport = addr, port;
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
1008 end
9473
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9445
diff changeset
1009 local ok, err = client:init();
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9445
diff changeset
1010 if not ok then return ok, err; end
9309
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
1011 if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
1012 client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
1013 end
7551
838212918f11 net.server_epoll: Rename arguments and varibles for consistensy
Kim Alvefur <zash@zash.se>
parents: 7550
diff changeset
1014 return client;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1015 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1016
7800
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7799
diff changeset
1017 -- New outgoing TCP connection
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 10681
diff changeset
1018 local function addclient(addr, port, listeners, read_size, tls_ctx, typ, extra)
9497
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1019 local create;
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1020 if not typ then
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1021 local n = inet_pton(addr);
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1022 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: 9477
diff changeset
1023 if #n == 16 then
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1024 typ = "tcp6";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1025 else
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1026 typ = "tcp4";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1027 end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1028 end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1029 if typ then
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1030 create = socket[typ];
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1031 end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1032 if type(create) ~= "function" then
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
1033 return nil, "invalid socket type";
9473
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9445
diff changeset
1034 end
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9445
diff changeset
1035 local conn, err = create();
10082
1df53ef1f60d net.server_epoll: Return errors from creating sockets
Kim Alvefur <zash@zash.se>
parents: 10081
diff changeset
1036 if not conn then return conn, err; end
9498
cc593002f2e2 net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents: 9497
diff changeset
1037 local ok, err = conn:settimeout(0);
cc593002f2e2 net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents: 9497
diff changeset
1038 if not ok then return ok, err; end
12514
194469fb46f9 net.server_epoll: Wrap LuaSocket object earlier to reuse option setting method
Kim Alvefur <zash@zash.se>
parents: 12513
diff changeset
1039 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra)
12512
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12481
diff changeset
1040 if cfg.tcp_fastopen then
12514
194469fb46f9 net.server_epoll: Wrap LuaSocket object earlier to reuse option setting method
Kim Alvefur <zash@zash.se>
parents: 12513
diff changeset
1041 client:setoption("tcp-fastopen-connect", 1);
12512
b7f07585ec4c net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents: 12481
diff changeset
1042 end
9499
36e379f058c8 net.server: Swich method for connecting sockets with remotes
Kim Alvefur <zash@zash.se>
parents: 9498
diff changeset
1043 local ok, err = conn:setpeername(addr, port);
9498
cc593002f2e2 net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents: 9497
diff changeset
1044 if not ok and err ~= "timeout" then return ok, err; end
12513
6efbcd52db21 net.server_epoll: Move call to refresh remote IP address out of wrapper
Kim Alvefur <zash@zash.se>
parents: 12512
diff changeset
1045 client:updatenames();
9473
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9445
diff changeset
1046 local ok, err = client:init();
10332
e05ea8223b32 net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents: 10331
diff changeset
1047 if not client.peername then
e05ea8223b32 net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents: 10331
diff changeset
1048 -- otherwise not set until connected
e05ea8223b32 net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents: 10331
diff changeset
1049 client.peername, client.peerport = addr, port;
e05ea8223b32 net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents: 10331
diff changeset
1050 end
9473
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9445
diff changeset
1051 if not ok then return ok, err; end
10328
5c2b31c823b9 net.server_epoll: Move a log message to improve ordering
Kim Alvefur <zash@zash.se>
parents: 10309
diff changeset
1052 client:debug("Client %s created", client);
9309
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
1053 if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
1054 client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
1055 end
7556
1f777b38b66c net.server_epoll: Make addclient conform to API (expected by net.http.request)
Kim Alvefur <zash@zash.se>
parents: 7555
diff changeset
1056 return client, conn;
7553
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7552
diff changeset
1057 end
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7552
diff changeset
1058
9319
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
1059 local function watchfd(fd, onreadable, onwritable)
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1060 local conn = setmetatable({
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1061 conn = fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1062 onreadable = onreadable;
9319
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
1063 onwritable = onwritable;
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1064 close = function (self)
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
1065 self:del();
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1066 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1067 }, interface_mt);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1068 if type(fd) == "number" then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1069 conn.getfd = function ()
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1070 return fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1071 end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1072 -- 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: 8778
diff changeset
1073 end
10420
49a828819696 net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents: 10419
diff changeset
1074 conn.id = new_id();
49a828819696 net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents: 10419
diff changeset
1075 conn.log = logger.init(("fdwatch%s"):format(conn.id));
9319
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
1076 conn:add(onreadable, onwritable);
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1077 return conn;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1078 end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1079
7800
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7799
diff changeset
1080 -- Dump all data from one connection into another
10283
dff360d00dfa net.server_epoll: Handle read size argument to link
Kim Alvefur <zash@zash.se>
parents: 10282
diff changeset
1081 local function link(from, to, read_size)
10280
6b8b255f1d10 net.server_epoll: Add debug logging for various connection events
Kim Alvefur <zash@zash.se>
parents: 10279
diff changeset
1082 from:debug("Linking to %s", to.id);
10284
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10283
diff changeset
1083 function from:onincoming(data)
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10283
diff changeset
1084 self:pause();
11805
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
1085 to:write(data);
10284
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10283
diff changeset
1086 end
10285
bcf61e22f841 net.server_epoll: Ignore unused self argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 10284
diff changeset
1087 function to:ondrain() -- luacheck: ignore 212/self
11805
2327e03d1f8d net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents: 11804
diff changeset
1088 from:resume();
10284
cd669975031b net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents: 10283
diff changeset
1089 end
10283
dff360d00dfa net.server_epoll: Handle read size argument to link
Kim Alvefur <zash@zash.se>
parents: 10282
diff changeset
1090 from:set_mode(read_size);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
1091 from:set(true, nil);
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
1092 to:set(nil, true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1093 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1094
9438
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9432
diff changeset
1095 -- COMPAT
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9432
diff changeset
1096 -- net.adns calls this but then replaces :send so this can be a noop
9439
988392a56495 net.server_epoll: Fix luacheck annotation
Kim Alvefur <zash@zash.se>
parents: 9438
diff changeset
1097 function interface:set_send(new_send) -- luacheck: ignore 212
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1098 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1099
7800
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7799
diff changeset
1100 -- Close all connections and servers
7794
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
1101 local function closeall()
7799
93643a61858a server_epoll: Ignore unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7797
diff changeset
1102 for fd, conn in pairs(fds) do -- luacheck: ignore 213/fd
7794
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
1103 conn:close();
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
1104 end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
1105 end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
1106
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1107 local quitting = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1108
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
1109 -- Signal main loop about shutdown via above upvalue
7796
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
1110 local function setquitting(quit)
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
1111 if quit then
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
1112 quitting = "quitting";
7797
d0c32d86724f server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents: 7796
diff changeset
1113 closeall();
11810
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11751
diff changeset
1114 addtimer(1, function ()
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11751
diff changeset
1115 if quitting then
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11751
diff changeset
1116 closeall();
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11751
diff changeset
1117 return 1;
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11751
diff changeset
1118 end
fe0cdbad19c3 net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents: 11751
diff changeset
1119 end);
11811
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
1120 if cfg.shutdown_deadline then
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
1121 addtimer(cfg.shutdown_deadline, function ()
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
1122 if quitting then
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
1123 for fd, conn in pairs(fds) do -- luacheck: ignore 213/fd
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
1124 conn:destroy();
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
1125 end
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
1126 end
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
1127 end);
ae43166fe931 net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents: 11810
diff changeset
1128 end
7796
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
1129 else
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
1130 quitting = nil;
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
1131 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1132 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1133
12827
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1134 local function loop_once()
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1135 runtimers(); -- Ignore return value because we only do this once
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1136 local fd, r, w = poll:wait(0);
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1137 if fd then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1138 local conn = fds[fd];
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1139 if conn then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1140 if r then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1141 conn:onreadable();
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1142 end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1143 if w then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1144 conn:onwritable();
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1145 end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1146 else
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1147 log("debug", "Removing unknown fd %d", fd);
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1148 poll:del(fd);
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1149 end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1150 else
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1151 return fd, r;
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1152 end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1153 end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1154
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
1155 -- Main loop
7795
03081bd5c5bb net.server_epoll: Add the 'once' argument to loop for parity with server_select
Kim Alvefur <zash@zash.se>
parents: 7794
diff changeset
1156 local function loop(once)
12827
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1157 if once then
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1158 return loop_once();
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1159 end
0605d4f03e25 net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents: 12594
diff changeset
1160
12828
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12827
diff changeset
1161 local t = 0;
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12827
diff changeset
1162 while not quitting do
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
1163 local fd, r, w = poll:wait(t);
12828
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12827
diff changeset
1164 if fd then
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12827
diff changeset
1165 t = 0;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1166 local conn = fds[fd];
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1167 if conn then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1168 if r then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1169 conn:onreadable();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1170 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1171 if w then
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
1172 conn:onwritable();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1173 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1174 else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1175 log("debug", "Removing unknown fd %d", fd);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
1176 poll:del(fd);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1177 end
12828
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12827
diff changeset
1178 elseif r == "timeout" then
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12827
diff changeset
1179 t = runtimers(cfg.max_wait, cfg.min_wait);
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12827
diff changeset
1180 elseif r ~= "signal" then
9445
af7eafe82447 net.server_epoll: Log error number from wait()
Kim Alvefur <zash@zash.se>
parents: 9441
diff changeset
1181 log("debug", "epoll_wait error: %s[%d]", r, w);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1182 end
12828
f33887f925e1 net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents: 12827
diff changeset
1183 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1184 return quitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1185 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1186
13440
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1187 local hook_signal;
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1188 if have_signal and signal.signalfd then
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1189 local function dispatch(self)
13441
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13440
diff changeset
1190 return self:on("signal", self.conn:read());
13440
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1191 end
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1192
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1193 function hook_signal(signum, cb)
13447
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13441
diff changeset
1194 local sigfd = signal.signalfd(signum);
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13441
diff changeset
1195 if not sigfd then
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13441
diff changeset
1196 log("error", "Could not hook signal %d", signum);
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13441
diff changeset
1197 return nil, "failed";
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13441
diff changeset
1198 end
5c9df28a57bb net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents: 13441
diff changeset
1199 local watch = watchfd(sigfd, dispatch);
13440
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1200 watch.listeners = { onsignal = cb };
13441
6d96b6eeee5a util.signal: Wrap signalfd in an userdatum for gc handling etc
Kim Alvefur <zash@zash.se>
parents: 13440
diff changeset
1201 watch.close = nil; -- revert to default
13450
f36e1e1b84fe net.server_epoll: Log creation of signalfd handles at noise level
Kim Alvefur <zash@zash.se>
parents: 13447
diff changeset
1202 watch:noise("Signal handler %d ready", signum);
13440
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1203 return watch;
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1204 end
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1205 end
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1206
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1207 return {
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1208 get_backend = function () return "epoll"; end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1209 addserver = addserver;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1210 addclient = addclient;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1211 add_task = addtimer;
10983
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10982
diff changeset
1212 timer = {
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10982
diff changeset
1213 -- API-compatible with util.timer
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10982
diff changeset
1214 add_task = addtimer;
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10982
diff changeset
1215 stop = closetimer;
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10982
diff changeset
1216 reschedule = reschedule;
10987
62355b801772 net.server_epoll: Expose way to turn monotonic time into wall clock time
Kim Alvefur <zash@zash.se>
parents: 10985
diff changeset
1217 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: 10985
diff changeset
1218 return t-monotonic()+realtime();
62355b801772 net.server_epoll: Expose way to turn monotonic time into wall clock time
Kim Alvefur <zash@zash.se>
parents: 10985
diff changeset
1219 end;
10983
0862325842ec net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents: 10982
diff changeset
1220 };
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9825
diff changeset
1221 listen = listen;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1222 loop = loop;
7794
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
1223 closeall = closeall;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1224 setquitting = setquitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1225 wrapclient = wrapclient;
10861
e12690a37795 net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents: 10854
diff changeset
1226 wrapserver = wrapserver;
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
1227 watchfd = watchfd;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1228 link = link;
7657
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
1229 set_config = function (newconfig)
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
1230 cfg = setmetatable(newconfig, default_config);
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
1231 end;
13440
b27de3d2bad6 net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents: 13422
diff changeset
1232 hook_signal = hook_signal;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1233
12481
2ee27587fec7 net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents: 12480
diff changeset
1234 tls_builder = function(basedir)
2ee27587fec7 net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents: 12480
diff changeset
1235 return sslconfig._new(tls_impl.new_context, basedir)
2ee27587fec7 net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents: 12480
diff changeset
1236 end,
2ee27587fec7 net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents: 12480
diff changeset
1237
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1238 -- libevent emulation
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1239 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
1240 addevent = function (fd, mode, callback)
10088
97da8452c6a6 net.server_epoll: Deprecate libevent emulation layer
Kim Alvefur <zash@zash.se>
parents: 10082
diff changeset
1241 log("warn", "Using deprecated libevent emulation, please update code to use watchfd API instead");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1242 local function onevent(self)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1243 local ret = self:callback();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1244 if ret == -1 then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
1245 self:set(false, false);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1246 elseif ret then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
1247 self:set(mode == "r" or mode == "rw", mode == "w" or mode == "rw");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1248 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1249 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1250
7817
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7811
diff changeset
1251 local conn = setmetatable({
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7811
diff changeset
1252 getfd = function () return fd; end;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1253 callback = callback;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1254 onreadable = onevent;
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
1255 onwritable = onevent;
7817
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7811
diff changeset
1256 close = function (self)
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
1257 self:del();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1258 fds[fd] = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1259 end;
7817
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7811
diff changeset
1260 }, interface_mt);
10420
49a828819696 net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents: 10419
diff changeset
1261 conn.id = conn:getfd();
49a828819696 net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents: 10419
diff changeset
1262 conn.log = logger.init(("fdwatch%d"):format(conn.id));
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
1263 local ok, err = conn:add(mode == "r" or mode == "rw", mode == "w" or mode == "rw");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1264 if not ok then return ok, err; end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1265 return conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1266 end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1267 };