Mercurial > prosody-hg
annotate net/server_epoll.lua @ 14217:7eb0e47418ab 13.0
util.human.io: Add simple version comparison
This is a small helper function that compares version string (it can be passed
to table.sort() as a comparator).
Full version sorts (e.g. semver, and natural/alphanumeric sort in general) are
more complex, and I would like to eventually support those. But this is a
stable branch and we don't need it for anything just yet.
Regarding justification for the stable branch:
The function is being committed with extensive tests, and isn't currently used
anywhere. The plan is to use it in an upcoming update of how TLS profiles are
configured, but the inputs in that case will be fixed (meaning that the risk
of breakage is lower than if we were running it against arbitrary data).
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 12 Jun 2026 11:38:39 +0100 |
| parents | e3ddbf7f2d3f |
| children | 9728c3fabeef |
| 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 setmetatable = setmetatable; |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
10 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
|
11 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
|
12 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
|
13 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
|
14 local ipairs = ipairs; |
|
10586
f86ed818a7f8
net.server_epoll: Collect full traceback from errors in listeners
Kim Alvefur <zash@zash.se>
parents:
10571
diff
changeset
|
15 local traceback = debug.traceback; |
|
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
16 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
|
17 local log = logger.init("server_epoll"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 local socket = require "socket"; |
|
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
19 local realtime = require "prosody.util.time".now; |
|
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
20 local monotonic = require "prosody.util.time".monotonic; |
|
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
21 local indexedbheap = require "prosody.util.indexedbheap"; |
|
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
22 local createtable = require "prosody.util.table".create; |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
23 local dbuffer = require "prosody.util.dbuffer"; |
|
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
24 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
|
25 local inet_pton = inet.pton; |
|
7737
f93b3083b46b
net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents:
7707
diff
changeset
|
26 local _SOCKETINVALID = socket._SOCKETINVALID or -1; |
|
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
27 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
|
28 local xpcall = require "prosody.util.xpcall".xpcall; |
|
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
29 local sslconfig = require "prosody.util.sslconfig"; |
|
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
30 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
|
31 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
|
32 |
|
12974
ba409c67353b
net: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12828
diff
changeset
|
33 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
|
34 local EEXIST = poller.EEXIST; |
|
9507
33d21f020b66
net.server_epoll: Ignore ENOENT when deregitering socket
Kim Alvefur <zash@zash.se>
parents:
9506
diff
changeset
|
35 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
|
36 |
|
13490
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
37 -- systemd socket activation |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
38 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
|
39 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
|
40 |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
41 local inherited_sockets = setmetatable({}, { |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
42 __index = function(t, k) |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
43 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
|
44 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
|
45 local serv = socket.tcp(); |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
46 if serv:getfd() ~= _SOCKETINVALID then |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
47 -- 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
|
48 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
|
49 setmetatable(t, nil); |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
50 break |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
51 end |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
52 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
|
53 debug.setmetatable(serv, serv_mt); |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
54 serv:settimeout(0); |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
55 local ip, port = serv:getsockname(); |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
56 t[ip .. ":" .. port] = serv; |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
57 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
|
58 -- 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
|
59 t["*:" .. port] = serv; |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
60 end |
|
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 |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
63 -- 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
|
64 setmetatable(t, nil); |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
65 return t[k]; |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
66 end; |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
67 }); |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
68 |
|
9506
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
69 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
|
70 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 local _ENV = nil; |
|
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8552
diff
changeset
|
72 -- luacheck: std none |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 |
|
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
74 local default_config = { __index = { |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
75 -- 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
|
76 read_timeout = 14 * 60; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
77 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
78 -- 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
|
79 send_timeout = 180; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
80 |
|
9824
729de68f0068
net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents:
9823
diff
changeset
|
81 -- 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
|
82 connect_timeout = 20; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
83 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
84 -- 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
|
85 tcp_backlog = 128; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
86 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
87 -- 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
|
88 accept_retry_interval = 10; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
89 |
| 11671 | 90 -- 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
|
91 read_retry_delay = 1e-06; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
92 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
93 -- 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
|
94 read_size = 8192; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
95 |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
96 -- Maximum size of send buffer, after which additional data is rejected |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
97 max_send_buffer_size = 32*1024*1024; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
98 |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
99 -- How many chunks (immutable strings) to keep in the send buffer |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
100 send_buffer_chunks = nil; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
101 |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
102 -- Maximum amount of data to send at once (to the TCP buffers), default based on /proc/sys/net/ipv4/tcp_wmem |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
103 max_send_chunk = 4*1024*1024; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
104 |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
105 -- 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
|
106 ssl_handshake_timeout = 60; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
107 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
108 -- 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
|
109 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
|
110 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
|
111 |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
112 -- Enable extra noisy debug logging |
|
12342
cba0b93320b7
net.server_epoll: Disable verbose mode by default
Kim Alvefur <zash@zash.se>
parents:
12110
diff
changeset
|
113 verbose = false; |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
114 |
|
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
|
115 -- 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
|
116 -- 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
|
117 fatal_errors = false; |
|
10228
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
118 |
|
10992
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
119 -- 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
|
120 protect_listeners = true; |
|
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
121 |
|
10228
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
122 -- Attempt writes instantly |
|
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
123 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
|
124 |
|
153d2fdd97d3
net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents:
11686
diff
changeset
|
125 -- TCP Keepalives |
|
153d2fdd97d3
net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents:
11686
diff
changeset
|
126 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
|
127 |
|
f9f6e82fb572
net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents:
11688
diff
changeset
|
128 -- 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
|
129 nagle = true; |
|
11696
917eca7be82b
net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents:
11695
diff
changeset
|
130 |
|
917eca7be82b
net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents:
11695
diff
changeset
|
131 -- Reuse write buffer tables |
|
917eca7be82b
net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents:
11695
diff
changeset
|
132 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
|
133 |
|
ae43166fe931
net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents:
11810
diff
changeset
|
134 --- 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
|
135 shutdown_deadline = 5; |
|
12512
b7f07585ec4c
net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents:
12481
diff
changeset
|
136 |
|
b7f07585ec4c
net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents:
12481
diff
changeset
|
137 -- TCP Fast Open |
|
b7f07585ec4c
net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents:
12481
diff
changeset
|
138 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
|
139 |
|
76c1725f4467
net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents:
12514
diff
changeset
|
140 -- 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
|
141 tcp_defer_accept = false; |
|
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
142 }}; |
|
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
143 local cfg = default_config.__index; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
144 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
145 local fds = createtable(10, 0); -- FD -> conn |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
146 |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
147 -- Timer and scheduling -- |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
148 |
|
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
149 local timers = indexedbheap.create(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 local function noop() end |
|
11761
dbf378dcf27b
net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents:
11752
diff
changeset
|
152 |
|
dbf378dcf27b
net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents:
11752
diff
changeset
|
153 -- 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
|
154 local closedtimers = {}; |
|
dbf378dcf27b
net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents:
11752
diff
changeset
|
155 |
|
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
156 local function closetimer(id) |
|
14156
57d8b5c5a4e7
net.server_epoll: Clean up timers after disconnection
Waqas Hussain <waqas20@gmail.com>
parents:
12342
diff
changeset
|
157 closedtimers[id] = true; |
|
57d8b5c5a4e7
net.server_epoll: Clean up timers after disconnection
Waqas Hussain <waqas20@gmail.com>
parents:
12342
diff
changeset
|
158 timers:remove(id); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 |
|
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
161 local function reschedule(id, time) |
|
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
162 time = monotonic() + time; |
|
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
163 timers:reprioritize(id, time); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
164 end |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
165 |
|
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
166 -- Add relative timer |
|
10982
276f16101d59
net.server_epoll: Make API-compatible with util.timer
Kim Alvefur <zash@zash.se>
parents:
10861
diff
changeset
|
167 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
|
168 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
|
169 if param ~= nil then |
|
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
170 local timer_callback = f |
|
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
171 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
|
172 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
|
173 return t; |
|
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
174 end |
|
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
175 end |
|
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
176 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
|
177 return id; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
178 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
179 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
180 -- Run callbacks of expired timers |
|
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
181 -- 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
|
182 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
|
183 -- Any timers at all? |
|
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
184 local elapsed = monotonic(); |
|
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
185 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
|
186 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
|
187 local readd; |
|
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
188 while peek do |
|
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
189 |
|
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
190 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
|
191 break; |
|
10681
e531273341d3
net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents:
10059
diff
changeset
|
192 end |
|
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
193 |
|
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
194 local _, timer, id = timers:pop(); |
|
10990
03e76ad725b2
net.server_epoll: ... and include a traceback
Kim Alvefur <zash@zash.se>
parents:
10989
diff
changeset
|
195 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
|
196 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
|
197 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
|
198 -- 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
|
199 -- 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
|
200 if readd then |
| 11264 | 201 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
|
202 else |
| 11264 | 203 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
|
204 end |
|
10989
b824fe9d0c8b
net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents:
10987
diff
changeset
|
205 elseif not ok then |
|
b824fe9d0c8b
net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents:
10987
diff
changeset
|
206 log("error", "Error in timer: %s", ret); |
|
10681
e531273341d3
net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents:
10059
diff
changeset
|
207 end |
|
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
208 |
|
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
209 peek = timers:peek(); |
|
10681
e531273341d3
net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents:
10059
diff
changeset
|
210 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
|
211 |
|
2c559953ad41
net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents:
11063
diff
changeset
|
212 if readd then |
|
11751
a8c9a78c6a4b
net.server_epoll: Fix to preserve ids of readded timers
Kim Alvefur <zash@zash.se>
parents:
11265
diff
changeset
|
213 for id, timer in pairs(readd) do |
| 11752 | 214 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
|
215 end |
|
2c559953ad41
net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents:
11063
diff
changeset
|
216 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
|
217 end |
|
2c559953ad41
net.server_epoll: Ensure timers can't run more than once per tick
Kim Alvefur <zash@zash.se>
parents:
11063
diff
changeset
|
218 |
|
11761
dbf378dcf27b
net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents:
11752
diff
changeset
|
219 if next(closedtimers) ~= nil then |
|
dbf378dcf27b
net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents:
11752
diff
changeset
|
220 closedtimers = {}; |
|
dbf378dcf27b
net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents:
11752
diff
changeset
|
221 end |
|
dbf378dcf27b
net.server_epoll: Prevent removed timers from being readded
Kim Alvefur <zash@zash.se>
parents:
11752
diff
changeset
|
222 |
|
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
223 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
|
224 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
|
225 else |
| 11264 | 226 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
|
227 end |
|
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
228 |
|
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
229 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
|
230 return min_wait; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
231 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
232 return next_delay; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
233 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
234 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
235 -- Socket handler interface |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
236 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
237 local interface = {}; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
238 local interface_mt = { __index = interface }; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
239 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
240 function interface_mt:__tostring() |
|
7585
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
241 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
|
242 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
|
243 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
|
244 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
|
245 end |
|
9321
146dc1e4c7ff
net.server_epoll: Simplify minimal string representation
Kim Alvefur <zash@zash.se>
parents:
9320
diff
changeset
|
246 return ("FD %d"):format(self:getfd()); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
247 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
248 |
|
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
249 interface.log = log; |
|
11497
960674938665
net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents:
11413
diff
changeset
|
250 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
|
251 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
|
252 end |
|
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
253 |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
254 interface.noise = interface.debug; |
|
11497
960674938665
net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents:
11413
diff
changeset
|
255 function interface:noise(msg, ...) |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
256 if cfg.verbose then |
|
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
257 return self:debug(msg, ...); |
|
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
258 end |
|
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
259 end |
|
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
260 |
|
11497
960674938665
net.server_epoll: Remove unnecessary luacheck annotations
Kim Alvefur <zash@zash.se>
parents:
11413
diff
changeset
|
261 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
|
262 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
|
263 end |
|
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
264 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
265 -- 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
|
266 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
|
267 self:on("detach"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
268 self.listeners = listeners; |
|
9387
33e52f727f0f
net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents:
9385
diff
changeset
|
269 self:on("attach", data); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
270 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
271 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
272 -- 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
|
273 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
|
274 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
|
275 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
|
276 return; |
|
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
277 end |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
278 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
|
279 if not listener then |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
280 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
|
281 return; |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
282 end |
|
10992
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
283 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
|
284 return listener(self, ...); |
|
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
285 end |
|
10991
aa85cb5b859f
net.server_epoll: Allow setting a custom error handler for listener
Kim Alvefur <zash@zash.se>
parents:
10990
diff
changeset
|
286 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
|
287 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
|
288 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
|
289 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
|
290 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
|
291 self:destroy(); |
|
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
292 else |
|
11239
06a5919e2496
net.server_epoll: Increase log level for error in callback
Kim Alvefur <zash@zash.se>
parents:
11068
diff
changeset
|
293 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
|
294 end |
|
10080
39ca4202ae1e
net.server_epoll: Return listener error message
Kim Alvefur <zash@zash.se>
parents:
10061
diff
changeset
|
295 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
|
296 end |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
297 return err; |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
298 end |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
299 |
|
10278
94c584d67533
net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents:
10234
diff
changeset
|
300 -- 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
|
301 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
|
302 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
|
303 end |
|
94c584d67533
net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents:
10234
diff
changeset
|
304 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
305 -- Return the file descriptor number |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
306 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
|
307 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
|
308 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
|
309 end |
|
7737
f93b3083b46b
net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents:
7707
diff
changeset
|
310 return _SOCKETINVALID; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
311 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
312 |
|
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
|
313 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
|
314 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
|
315 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
|
316 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
317 -- Get IP address |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
318 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
|
319 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
|
320 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
321 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
322 -- 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
|
323 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
|
324 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
|
325 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
326 |
|
11793
9006ff4838ff
net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents:
11761
diff
changeset
|
327 -- 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
|
328 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
|
329 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
|
330 return self.peerport; |
|
9006ff4838ff
net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents:
11761
diff
changeset
|
331 else |
|
9006ff4838ff
net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents:
11761
diff
changeset
|
332 return self.sockport; |
|
9006ff4838ff
net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents:
11761
diff
changeset
|
333 end |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
334 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
335 |
|
11793
9006ff4838ff
net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents:
11761
diff
changeset
|
336 -- 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
|
337 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
|
338 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
|
339 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
|
340 else |
|
9006ff4838ff
net.server_epoll: Try to make port number related methods sane
Kim Alvefur <zash@zash.se>
parents:
11761
diff
changeset
|
341 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
|
342 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
343 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
344 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
345 -- Return underlying socket |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
346 function interface:socket() |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
347 return self.conn; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
348 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
349 |
|
7910
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
350 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
|
351 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
|
352 end |
|
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
353 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
354 function interface:setoption(k, v) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
355 -- 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
|
356 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
|
357 if not ok then |
|
247561bf6fca
net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents:
11677
diff
changeset
|
358 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
|
359 return ok, ret; |
|
247561bf6fca
net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents:
11677
diff
changeset
|
360 elseif not ret then |
|
247561bf6fca
net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents:
11677
diff
changeset
|
361 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
|
362 return ret, err; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
363 end |
|
11685
247561bf6fca
net.server_epoll: Log failures to set socket options
Kim Alvefur <zash@zash.se>
parents:
11677
diff
changeset
|
364 return ret; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
365 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
366 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
367 -- Timeout for detecting dead or idle sockets |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
368 function interface:setreadtimeout(t) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
369 if t == false then |
|
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 closetimer(self._readtimeout); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
372 self._readtimeout = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
373 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
374 return |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
375 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
376 t = t or cfg.read_timeout; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
377 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
|
378 reschedule(self._readtimeout, t); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
379 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
380 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
|
381 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
|
382 self:noise("Read timeout handled"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
383 return cfg.read_timeout; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
384 else |
|
10417
d8a0b0d21c81
net.server_epoll: Improve read timeout debug messages
Kim Alvefur <zash@zash.se>
parents:
10416
diff
changeset
|
385 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
|
386 self:on("disconnect", "read timeout"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
387 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
388 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
389 end); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
390 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
391 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
392 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
393 -- Timeout for detecting dead sockets |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
394 function interface:setwritetimeout(t) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
395 if t == false then |
|
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 closetimer(self._writetimeout); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
398 self._writetimeout = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
399 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
400 return |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
401 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
|
402 t = t or cfg.send_timeout; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
403 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
|
404 reschedule(self._writetimeout, t); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
405 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
406 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
|
407 self:noise("Write timeout"); |
|
10638
92918212ee83
net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents:
10589
diff
changeset
|
408 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
|
409 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
410 end); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
411 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
412 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
413 |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
414 function interface:add(r, w) |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
415 local fd = self:getfd(); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
416 if fd < 0 then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
417 return nil, "invalid fd"; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
418 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
419 if r == nil then r = self._wantread; end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
420 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
|
421 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
|
422 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
|
423 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
|
424 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
|
425 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
|
426 end |
|
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
427 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
|
428 return ok, err; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
429 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
430 self._wantread, self._wantwrite = r, w; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
431 fds[fd] = self; |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
432 self:noise("Registered in poller"); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
433 return true; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
434 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
435 |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
436 function interface:set(r, w) |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
437 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
|
438 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
|
439 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
|
440 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
441 if r == nil then r = self._wantread; end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
442 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
|
443 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
|
444 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
|
445 end |
|
9384
5c8006ce8cb8
net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents:
9383
diff
changeset
|
446 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
|
447 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
|
448 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
|
449 return ok, err; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
450 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
451 self._wantread, self._wantwrite = r, w; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
452 return true; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
453 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
454 |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
455 function interface:del() |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
456 local fd = self:getfd(); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
457 if fd < 0 then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
458 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
|
459 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
460 if fds[fd] ~= self then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
461 return nil, "unregistered fd"; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
462 end |
|
9384
5c8006ce8cb8
net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents:
9383
diff
changeset
|
463 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
|
464 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
|
465 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
|
466 return ok, err; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
467 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
468 self._wantread, self._wantwrite = nil, nil; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
469 fds[fd] = nil; |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
470 self:noise("Unregistered from poller"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
471 return true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
472 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
473 |
|
9320
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
474 function interface:setflags(r, w) |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
475 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
|
476 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
|
477 return true; -- no change |
|
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 return self:add(r, w); |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
480 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
481 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
|
482 return self:del(); |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
483 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
484 return self:set(r, w); |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
485 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
486 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
487 -- Called when socket is readable |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
488 function interface:onreadable() |
|
9311
9b0604fe01f1
net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents:
9310
diff
changeset
|
489 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
|
490 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
|
491 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
|
492 self:onincoming(data); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
493 else |
|
9931
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
494 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
|
495 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
|
496 err = "timeout"; |
|
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
497 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
|
498 self:set(nil, true); |
|
11702
c206430e2643
net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents:
11701
diff
changeset
|
499 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
|
500 err = "timeout"; |
|
11592
64cfa396bb84
net.server_epoll: Fix reporting of socket connect timeout
Kim Alvefur <zash@zash.se>
parents:
11497
diff
changeset
|
501 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
|
502 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
|
503 end |
|
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
504 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
|
505 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
|
506 self:onincoming(partial, err); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
507 end |
|
11814
f27b9319e0da
net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents:
11813
diff
changeset
|
508 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
|
509 self:debug("Connection closed by remote"); |
|
13571
ca041359c045
net.server_epoll: Don't try to flush buffer on closed connections
Kim Alvefur <zash@zash.se>
parents:
13570
diff
changeset
|
510 self:on("disconnect", err); |
|
ca041359c045
net.server_epoll: Don't try to flush buffer on closed connections
Kim Alvefur <zash@zash.se>
parents:
13570
diff
changeset
|
511 self:destroy(); |
|
11814
f27b9319e0da
net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents:
11813
diff
changeset
|
512 return; |
|
f27b9319e0da
net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents:
11813
diff
changeset
|
513 elseif err ~= "timeout" then |
|
f27b9319e0da
net.server_epoll: Separate handling of "closed" from other errors
Kim Alvefur <zash@zash.se>
parents:
11813
diff
changeset
|
514 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
|
515 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
|
516 self:destroy(); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
517 return; |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
518 end |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
519 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
|
520 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
|
521 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
|
522 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
|
523 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
|
524 self:setreadtimeout(false); |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
525 self:pausefor(cost); |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
526 return; |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
527 end |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
528 end |
|
11701
a3572205c5bf
net.server_epoll: Skip reset of read timeout when not reading
Kim Alvefur <zash@zash.se>
parents:
11700
diff
changeset
|
529 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
|
530 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
|
531 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
|
532 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
|
533 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
|
534 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
|
535 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
536 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
537 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
538 -- Called when socket is writable |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
539 function interface:onwritable() |
|
11920
ff4e34c448a4
net.server_epoll: Try harder to avoid reentrant opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
11858
diff
changeset
|
540 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
|
541 self:onconnect(); |
|
12011
9dc36fdbdba1
net.server_epoll: Ensure calls to :write() return something
Kim Alvefur <zash@zash.se>
parents:
11972
diff
changeset
|
542 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
|
543 self:on("predrain"); |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
544 local buffer = self.writebuffer or ""; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
545 -- Naming things ... s/data/slice/ ? |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
546 local data = buffer:sub(1, cfg.max_send_chunk); |
|
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; |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
549 if ok and #data < #buffer then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
550 -- Sent the whole 'data' but there's more in the buffer |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
551 ok, err, partial = nil, "timeout", ok; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
552 end |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
553 self:debug("Sent %d out of %d buffered bytes", ok and #data or partial or 0, #buffer); |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
554 if ok then -- all the data we had was sent successfully |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
555 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
|
556 if cfg.keep_buffers and type(buffer) == "table" then |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
557 buffer:discard(ok); |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
558 else -- string or don't keep buffers |
|
11696
917eca7be82b
net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents:
11695
diff
changeset
|
559 self.writebuffer = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
560 end |
|
11922
28f5c8061dad
net.server_epoll: Fix streaming downloads (thanks Menel)
Kim Alvefur <zash@zash.se>
parents:
11920
diff
changeset
|
561 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
|
562 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
|
563 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
|
564 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
|
565 elseif partial then |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
566 if type(buffer) == "table" then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
567 buffer:discard(partial); |
|
11696
917eca7be82b
net.server_epoll: Optionally let go of buffers
Kim Alvefur <zash@zash.se>
parents:
11695
diff
changeset
|
568 else |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
569 self.writebuffer = data:sub(partial + 1); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
570 end |
|
10228
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
571 self:set(nil, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
572 self:setwritetimeout(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
573 end |
|
11920
ff4e34c448a4
net.server_epoll: Try harder to avoid reentrant opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
11858
diff
changeset
|
574 self._writing = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
575 if err == "wantwrite" or err == "timeout" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
576 self:set(nil, true); |
|
11702
c206430e2643
net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents:
11701
diff
changeset
|
577 self:setwritetimeout(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
578 elseif err == "wantread" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
579 self:set(true, nil); |
|
11702
c206430e2643
net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents:
11701
diff
changeset
|
580 self:setreadtimeout(); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
581 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
|
582 self:on("disconnect", err); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
583 self:destroy(); |
|
11695
1573099157c9
net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
11694
diff
changeset
|
584 return ok, err; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
585 end |
|
12011
9dc36fdbdba1
net.server_epoll: Ensure calls to :write() return something
Kim Alvefur <zash@zash.se>
parents:
11972
diff
changeset
|
586 return true, err; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
587 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
588 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
589 -- The write buffer has been successfully emptied |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
590 function interface:ondrain() |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
591 return self:on("drain"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
592 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
593 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
594 -- 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
|
595 function interface:write(data) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
596 local buffer = self.writebuffer; |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
597 -- (nil) -> save string |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
598 -- (string) -> convert to buffer (3 tables!) |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
599 -- (buffer) -> write to buffer |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
600 if not buffer then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
601 self.writebuffer = data; |
|
11697
6c3d8aa3bbd9
net.server_epoll: Avoid allocating a buffer table for single writes
Kim Alvefur <zash@zash.se>
parents:
11696
diff
changeset
|
602 elseif type(buffer) == "string" then |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
603 local prev_buffer = buffer; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
604 buffer = dbuffer.new(cfg.max_send_buffer_size, cfg.send_buffer_chunks); |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
605 self.writebuffer = buffer; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
606 if prev_buffer then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
607 -- TODO refactor, there's 3 copies of these lines |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
608 if not buffer:write(prev_buffer) then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
609 if self._write_lock then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
610 return false; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
611 end |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
612 -- Try to flush buffer to make room |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
613 self:onwritable(); |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
614 if not buffer:write(prev_buffer) then |
|
13553
850e4ade7a01
net.server_epoll: Make running out of buffer space a fatal error
Kim Alvefur <zash@zash.se>
parents:
13552
diff
changeset
|
615 self:on("disconnect", "no space left in buffer"); |
|
850e4ade7a01
net.server_epoll: Make running out of buffer space a fatal error
Kim Alvefur <zash@zash.se>
parents:
13552
diff
changeset
|
616 self:destroy(); |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
617 return false; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
618 end |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
619 end |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
620 end |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
621 if not buffer:write(data) then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
622 if self._write_lock then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
623 return false; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
624 end |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
625 self:onwritable(); |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
626 if not buffer:write(data) then |
|
13553
850e4ade7a01
net.server_epoll: Make running out of buffer space a fatal error
Kim Alvefur <zash@zash.se>
parents:
13552
diff
changeset
|
627 self:on("disconnect", "no space left in buffer"); |
|
850e4ade7a01
net.server_epoll: Make running out of buffer space a fatal error
Kim Alvefur <zash@zash.se>
parents:
13552
diff
changeset
|
628 self:destroy(); |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
629 return false; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
630 end |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
631 end |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
632 elseif not buffer:write(data) then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
633 if self._write_lock then |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
634 return false; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
635 end |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
636 self:onwritable(); |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
637 if not buffer:write(data) then |
|
13553
850e4ade7a01
net.server_epoll: Make running out of buffer space a fatal error
Kim Alvefur <zash@zash.se>
parents:
13552
diff
changeset
|
638 self:on("disconnect", "no space left in buffer"); |
|
850e4ade7a01
net.server_epoll: Make running out of buffer space a fatal error
Kim Alvefur <zash@zash.se>
parents:
13552
diff
changeset
|
639 self:destroy(); |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
640 return false; |
|
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
641 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
642 end |
|
11920
ff4e34c448a4
net.server_epoll: Try harder to avoid reentrant opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
11858
diff
changeset
|
643 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
|
644 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
|
645 self._opportunistic_write = true; |
|
11695
1573099157c9
net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
11694
diff
changeset
|
646 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
|
647 self._opportunistic_write = nil; |
|
11695
1573099157c9
net.server_epoll: Propagate returns from opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
11694
diff
changeset
|
648 return ret, err; |
|
11805
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
649 end |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
650 self:setwritetimeout(); |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
651 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
|
652 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
653 return #data; |
|
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 interface.send = interface.write; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
656 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
657 -- Close, possibly after writing is done |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
658 function interface:close() |
|
13652
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
659 local status, err; |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
660 if self.writebuffer and #self.writebuffer ~= 0 then |
|
11972
520ce76440ad
net.server_epoll: Prevent loop attempting to send last data after close
Kim Alvefur <zash@zash.se>
parents:
11922
diff
changeset
|
661 self._connected = false; |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
662 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
|
663 self:setreadtimeout(false); |
|
11658
36942fa001b4
net.server_epoll: Ensure timeout after closing
Kim Alvefur <zash@zash.se>
parents:
11595
diff
changeset
|
664 self:setwritetimeout(); |
|
7593
0266434d7df1
net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents:
7592
diff
changeset
|
665 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
|
666 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
|
667 self.ondrain = interface.close; |
|
13652
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
668 elseif self.conn.shutdown and self._tls then |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
669 status, err = self.conn:shutdown(); |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
670 self.onreadable = interface.close; |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
671 self.onwritable = interface.close; |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
672 if err == nil then |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
673 if status == true then |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
674 self._tls = false; |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
675 end |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
676 return self:close(); |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
677 elseif err == "wantread" then |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
678 self:set(true, nil); |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
679 self:setreadtimeout(); |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
680 elseif err == "wantwrite" then |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
681 self:set(nil, true); |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
682 self:setwritetimeout(); |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
683 else |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
684 self._tls = false; |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
685 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
686 else |
|
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
687 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
|
688 self.write, self.send = noop, noop; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
689 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
|
690 self:on("disconnect"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
691 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
692 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
693 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
694 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
695 function interface:destroy() |
|
13652
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
696 -- make sure tls sockets aren't put in blocking mode |
|
a08065207ef0
net.server_epoll: Call :shutdown() on TLS sockets when supported
Martijn van Duren <martijn@openbsd.org>
parents:
13571
diff
changeset
|
697 if self.conn.shutdown and self._tls then self.conn:shutdown(); end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
698 self:del(); |
|
14156
57d8b5c5a4e7
net.server_epoll: Clean up timers after disconnection
Waqas Hussain <waqas20@gmail.com>
parents:
12342
diff
changeset
|
699 if self._pausefor then |
|
57d8b5c5a4e7
net.server_epoll: Clean up timers after disconnection
Waqas Hussain <waqas20@gmail.com>
parents:
12342
diff
changeset
|
700 closetimer(self._pausefor); |
|
57d8b5c5a4e7
net.server_epoll: Clean up timers after disconnection
Waqas Hussain <waqas20@gmail.com>
parents:
12342
diff
changeset
|
701 self._pausefor = nil; |
|
57d8b5c5a4e7
net.server_epoll: Clean up timers after disconnection
Waqas Hussain <waqas20@gmail.com>
parents:
12342
diff
changeset
|
702 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
703 self:setwritetimeout(false); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
704 self:setreadtimeout(false); |
|
7594
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
705 self.onreadable = noop; |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
706 self.onwritable = noop; |
|
7594
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
707 self.destroy = noop; |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
708 self.close = noop; |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
709 self.on = noop; |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
710 self.conn:close(); |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
711 self.conn = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
712 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
713 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
714 function interface:ssl() |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
715 return self._tls; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
716 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
717 |
|
11595
8985efc6792d
net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents:
11592
diff
changeset
|
718 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
|
719 self._sslctx = sslctx; |
|
8985efc6792d
net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents:
11592
diff
changeset
|
720 end |
|
8985efc6792d
net.server_epoll: Add missing method for changing TLS context
Kim Alvefur <zash@zash.se>
parents:
11592
diff
changeset
|
721 |
|
12480
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
722 function interface:sslctx() |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
723 return self.tls_ctx |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
724 end |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
725 |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
726 function interface:ssl_info() |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
727 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
|
728 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
|
729 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
|
730 return sock:info(); |
|
12480
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
731 end |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
732 |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
733 function interface:ssl_peercertificate() |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
734 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
|
735 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
|
736 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
|
737 return sock:getpeercertificate(); |
|
12480
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
738 end |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
739 |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
740 function interface:ssl_peerverification() |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
741 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
|
742 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
|
743 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
|
744 return sock:getpeerverification(); |
|
12480
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
745 end |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
746 |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
747 function interface:ssl_peerfinished() |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
748 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
|
749 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
|
750 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
|
751 return sock:getpeerfinished(); |
|
12480
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
752 end |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
753 |
|
12594
29685403be32
mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents:
12542
diff
changeset
|
754 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
|
755 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
|
756 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
|
757 if sock.exportkeyingmaterial then |
|
29685403be32
mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents:
12542
diff
changeset
|
758 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
|
759 end |
|
29685403be32
mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents:
12542
diff
changeset
|
760 end |
|
29685403be32
mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents:
12542
diff
changeset
|
761 |
|
29685403be32
mod_saslauth: Implement RFC 9266 'tls-exporter' channel binding (#1760)
Kim Alvefur <zash@zash.se>
parents:
12542
diff
changeset
|
762 |
|
9300
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
763 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
|
764 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
|
765 self.starttls = false; |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
766 if self.writebuffer and #self.writebuffer ~= 0 then |
|
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
767 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
|
768 self.ondrain = interface.starttls; |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
769 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
|
770 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
|
771 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
|
772 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
|
773 end |
|
11672
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
774 self.onwritable = interface.inittls; |
|
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
775 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
|
776 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
|
777 self:setreadtimeout(false); |
|
13809
2cfb6625b6d2
net.server_epoll: Use correct connection timeout when initiating Direct TLS
Kim Alvefur <zash@zash.se>
parents:
13754
diff
changeset
|
778 self:setwritetimeout(self._connected and cfg.ssl_handshake_timeout or cfg.connect_timeout); |
|
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
779 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
|
780 end |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
781 end |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
782 |
|
11676
993462e5e4d4
net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents:
11675
diff
changeset
|
783 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
|
784 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
|
785 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
|
786 self._tls = true; |
|
11839
19b50ce9ef5a
net.server_epoll: Prevent starttls on direct TLS connections
Kim Alvefur <zash@zash.se>
parents:
11814
diff
changeset
|
787 self.starttls = false; |
|
11672
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
788 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
|
789 self:updatenames(); -- Can't getpeer/sockname after wrap() |
|
12480
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
790 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
|
791 if not conn then |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
792 self:on("disconnect", err); |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
793 self:destroy(); |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
794 return conn, err; |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
795 end |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
796 conn:settimeout(0); |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
797 self.conn = conn; |
|
11672
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
798 if conn.sni then |
|
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
799 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
|
800 conn:sni(self.servername); |
|
12480
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
801 elseif next(self.tls_ctx._sni_contexts) ~= nil then |
|
7e9ebdc75ce4
net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents:
12342
diff
changeset
|
802 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
|
803 end |
|
11672
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
804 end |
|
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
805 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
|
806 -- TODO Error handling |
|
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
807 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
|
808 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
|
809 else |
|
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
810 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
|
811 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
|
812 for _, tlsa in ipairs(self.extra.tlsa) do |
|
13754
0bd65ed1fd10
net.server_epoll: Improve readability of DANE noise
Kim Alvefur <zash@zash.se>
parents:
13652
diff
changeset
|
813 self:noise("TLSA: %s", tlsa); |
|
11672
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
814 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
|
815 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
816 end |
|
11805
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
817 end |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
818 self:on("starttls"); |
|
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
819 self.ondrain = nil; |
|
11672
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
820 self.onwritable = interface.tlshandshake; |
|
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
821 self.onreadable = interface.tlshandshake; |
|
11676
993462e5e4d4
net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents:
11675
diff
changeset
|
822 if now then |
|
993462e5e4d4
net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents:
11675
diff
changeset
|
823 return self:tlshandshake() |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
824 end |
|
11699
1275dad71afd
net.server_epoll: Use only fatal "write" timeout during TLS negotiation
Kim Alvefur <zash@zash.se>
parents:
11698
diff
changeset
|
825 self:setreadtimeout(false); |
|
11674
8253f6a30afc
net.server_epoll: Use TLS handshake timeout after initiating handshake
Kim Alvefur <zash@zash.se>
parents:
11673
diff
changeset
|
826 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
|
827 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
|
828 end |
|
79f8e29e88a0
net.server_epoll: Factor out TLS initialization into a method
Kim Alvefur <zash@zash.se>
parents:
11671
diff
changeset
|
829 |
|
10847
42c8dce6e765
net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents:
10846
diff
changeset
|
830 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
|
831 self:setreadtimeout(false); |
|
10846
d0b098d0f6c3
net.server_epoll: Log some noise before TLS handshake step
Kim Alvefur <zash@zash.se>
parents:
10683
diff
changeset
|
832 self:noise("Continuing TLS handshake"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
833 local ok, err = self.conn:dohandshake(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
834 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
|
835 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
|
836 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
|
837 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
|
838 else |
|
6a997f0ceba8
net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents:
10305
diff
changeset
|
839 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
|
840 end |
|
11700
79d30de13fdb
net.server_epoll: Reduce timer churn during TLS handshake
Kim Alvefur <zash@zash.se>
parents:
11699
diff
changeset
|
841 self:setwritetimeout(false); |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
842 self.onwritable = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
843 self.onreadable = nil; |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
844 self:on("status", "ssl-handshake-complete"); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
845 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
|
846 self:onconnect(); |
|
98bcc19361db
net.server_epoll: Call onconnect immediately after TLS handshake completion
Kim Alvefur <zash@zash.se>
parents:
11676
diff
changeset
|
847 self:onreadable(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
848 elseif err == "wantread" then |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
849 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
|
850 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
|
851 self:setwritetimeout(cfg.ssl_handshake_timeout); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
852 elseif err == "wantwrite" then |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
853 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
|
854 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
|
855 self:setwritetimeout(cfg.ssl_handshake_timeout); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
856 else |
|
10649
228277be4a28
net.server_epoll: Reduce log level of TLS handshake errors to debug
Kim Alvefur <zash@zash.se>
parents:
10638
diff
changeset
|
857 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
|
858 self:on("disconnect", err); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
859 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
860 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
861 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
862 |
|
11063
30d3f6f85eb8
net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents:
10681
diff
changeset
|
863 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
|
864 client:settimeout(0); |
|
10279
0e1701197722
net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents:
10278
diff
changeset
|
865 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
|
866 local conn = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
867 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
|
868 _server = server; |
|
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
869 created = realtime(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
870 listeners = listeners; |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
871 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
|
872 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
|
873 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
|
874 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
|
875 id = conn_id; |
|
0e1701197722
net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents:
10278
diff
changeset
|
876 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
|
877 extra = extra; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
878 }, interface_mt); |
|
7591
138f16eb39fb
net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents:
7590
diff
changeset
|
879 |
|
11063
30d3f6f85eb8
net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents:
10681
diff
changeset
|
880 if extra then |
|
30d3f6f85eb8
net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents:
10681
diff
changeset
|
881 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
|
882 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
|
883 end |
|
30d3f6f85eb8
net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents:
10681
diff
changeset
|
884 end |
|
30d3f6f85eb8
net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents:
10681
diff
changeset
|
885 |
|
9383
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
886 return conn; |
|
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
887 end |
|
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
888 |
|
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
889 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
|
890 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
|
891 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
|
892 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
|
893 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
|
894 end |
|
9383
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
895 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
|
896 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
|
897 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
|
898 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
899 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
900 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
901 -- A server interface has new incoming connections waiting |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
902 -- This replaces the onreadable callback |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
903 function interface:onacceptable() |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
904 local conn, err = self.conn:accept(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
905 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
|
906 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
|
907 self:pausefor(cfg.accept_retry_interval); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
908 return; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
909 end |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
910 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
|
911 client:updatenames(); |
|
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
912 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
|
913 client:defaultoptions(); |
|
11738
3f1450ec37f4
net.server_epoll: Improve efficiency of opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
11703
diff
changeset
|
914 client._writable = cfg.opportunistic_writes; |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
915 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
|
916 client:add(true, true); |
|
11676
993462e5e4d4
net.server_epoll: Refactor immediate TLS handshake start
Kim Alvefur <zash@zash.se>
parents:
11675
diff
changeset
|
917 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
|
918 else |
|
11659
00295a8e5bcf
net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents:
11658
diff
changeset
|
919 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
|
920 client:onconnect(); |
|
11660
68f0196ece2a
net.server_epoll: Immediately attempt to read from newly accepted connections
Kim Alvefur <zash@zash.se>
parents:
11659
diff
changeset
|
921 client:onreadable(); |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
922 end |
|
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
923 end |
|
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
924 |
|
11659
00295a8e5bcf
net.server_epoll: Separate handling of new incoming and outgoing connections
Kim Alvefur <zash@zash.se>
parents:
11658
diff
changeset
|
925 -- Initialization for outgoing connections |
|
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
926 function interface:init() |
|
9824
729de68f0068
net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents:
9823
diff
changeset
|
927 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
|
928 self:defaultoptions(); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
929 return self:add(true, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
930 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
931 |
|
11686
f4c3dcc907d8
net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents:
11685
diff
changeset
|
932 function interface:defaultoptions() |
|
11689
f9f6e82fb572
net.server_epoll: Add setting for disabling the Nagle algorithm
Kim Alvefur <zash@zash.se>
parents:
11688
diff
changeset
|
933 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
|
934 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
|
935 end |
|
11687
153d2fdd97d3
net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents:
11686
diff
changeset
|
936 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
|
937 self:setoption("keepalive", true); |
|
11688
3fc564f7441b
net.server_epoll: Support setting keepalive idle time
Kim Alvefur <zash@zash.se>
parents:
11687
diff
changeset
|
938 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
|
939 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
|
940 end |
|
11687
153d2fdd97d3
net.server_epoll: Add way to enable TCP keeplives on all connections
Kim Alvefur <zash@zash.se>
parents:
11686
diff
changeset
|
941 end |
|
11686
f4c3dcc907d8
net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents:
11685
diff
changeset
|
942 end |
|
f4c3dcc907d8
net.server_epoll: Add an (empty) method for setting socket options
Kim Alvefur <zash@zash.se>
parents:
11685
diff
changeset
|
943 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
944 function interface:pause() |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
945 self:noise("Pause reading"); |
|
11702
c206430e2643
net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents:
11701
diff
changeset
|
946 self:setreadtimeout(false); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
947 return self:set(false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
948 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
949 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
950 function interface:resume() |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
951 self:noise("Resume reading"); |
|
11702
c206430e2643
net.server_epoll: Ensure timeouts match epoll flags
Kim Alvefur <zash@zash.se>
parents:
11701
diff
changeset
|
952 self:setreadtimeout(); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
953 return self:set(true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
954 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
955 |
| 7624 | 956 -- Pause connection for some time |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
957 function interface:pausefor(t) |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
958 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
|
959 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
|
960 closetimer(self._pausefor); |
|
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
961 self._pausefor = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
962 end |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
963 if t == false then return; end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
964 self:set(false); |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
965 self._pausefor = addtimer(t, function () |
|
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
966 self._pausefor = nil; |
|
14156
57d8b5c5a4e7
net.server_epoll: Clean up timers after disconnection
Waqas Hussain <waqas20@gmail.com>
parents:
12342
diff
changeset
|
967 if not self.conn then |
|
57d8b5c5a4e7
net.server_epoll: Clean up timers after disconnection
Waqas Hussain <waqas20@gmail.com>
parents:
12342
diff
changeset
|
968 return; |
|
57d8b5c5a4e7
net.server_epoll: Clean up timers after disconnection
Waqas Hussain <waqas20@gmail.com>
parents:
12342
diff
changeset
|
969 end |
|
9994
524b8cd76780
net.server_epoll: Restore wantread flag after pause (fixes #1354)
Kim Alvefur <zash@zash.se>
parents:
9932
diff
changeset
|
970 self:set(true); |
|
11743
856dada099fa
net.server_epoll: Split, attempt to clarify dirty noise message
Kim Alvefur <zash@zash.se>
parents:
11741
diff
changeset
|
971 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
|
972 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
|
973 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
|
974 self:onreadable(); |
|
13932
334fb7adb0bc
net.server_epoll: Restore idle checks after pause (e.g. rate limits)
Kim Alvefur <zash@zash.se>
parents:
13809
diff
changeset
|
975 else |
|
334fb7adb0bc
net.server_epoll: Restore idle checks after pause (e.g. rate limits)
Kim Alvefur <zash@zash.se>
parents:
13809
diff
changeset
|
976 self:setreadtimeout(); |
|
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
|
977 end |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
978 end); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
979 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
980 |
|
10098
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
981 function interface:setlimit(Bps) |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
982 if Bps > 0 then |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
983 self._limit = 1/Bps; |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
984 else |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
985 self._limit = nil; |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
986 end |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
987 end |
|
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
988 |
|
9581
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
989 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
|
990 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
|
991 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
|
992 end |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
993 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
|
994 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
|
995 self:setwritetimeout(false); |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
996 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
|
997 end |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
998 |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
999 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
|
1000 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
|
1001 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
|
1002 end |
|
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
1003 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
|
1004 self._write_lock = nil; |
|
13552
f0b2c026e542
net.server_epoll: Improve efficiency of sending much buffered data
Kim Alvefur <zash@zash.se>
parents:
13490
diff
changeset
|
1005 if self.writebuffer and #self.writebuffer ~= 0 then |
|
9581
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
1006 self:setwritetimeout(); |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
1007 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
|
1008 end |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
1009 end |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
1010 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
1011 -- Connected! |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1012 function interface:onconnect() |
|
10638
92918212ee83
net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents:
10589
diff
changeset
|
1013 self._connected = true; |
|
9594
dcf466e04f81
net.server_epoll: Use method to update peername on connect
Kim Alvefur <zash@zash.se>
parents:
9587
diff
changeset
|
1014 self:updatenames(); |
|
10331
76bd77ad6a2a
server_epoll: Log full string represestation when connected
Kim Alvefur <zash@zash.se>
parents:
10330
diff
changeset
|
1015 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
|
1016 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
|
1017 self:on("connect"); |
|
8506
174fd716c9fa
server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents:
8271
diff
changeset
|
1018 end |
|
174fd716c9fa
server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents:
8271
diff
changeset
|
1019 |
|
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
|
1020 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
|
1021 local server = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1022 conn = conn; |
|
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
1023 created = realtime(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1024 listeners = listeners; |
|
9835
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
1025 read_size = config and config.read_size; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1026 onreadable = interface.onacceptable; |
|
9835
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
1027 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
|
1028 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
|
1029 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
|
1030 sockname = addr; |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
1031 sockport = port; |
|
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
1032 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
|
1033 }, interface_mt); |
|
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
1034 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
|
1035 if cfg.tcp_fastopen then |
|
b7f07585ec4c
net.server_epoll: Add support for TCP Fast Open
Kim Alvefur <zash@zash.se>
parents:
12481
diff
changeset
|
1036 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
|
1037 end |
|
12515
76c1725f4467
net.server_epoll: Add option to defer accept() until data available
Kim Alvefur <zash@zash.se>
parents:
12514
diff
changeset
|
1038 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
|
1039 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
|
1040 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
1041 server:add(true, false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1042 return server; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1043 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1044 |
|
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
|
1045 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
|
1046 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
|
1047 if inherited then |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
1048 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
|
1049 -- 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
|
1050 -- privileges to create them |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
1051 conn.destroy = interface.del; |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
1052 return conn; |
|
6f840763fc73
net.server_epoll: Add support for systemd socket activation
Kim Alvefur <zash@zash.se>
parents:
13450
diff
changeset
|
1053 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1054 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
|
1055 if not conn then return conn, err; end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1056 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
|
1057 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
|
1058 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
|
1059 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1060 -- COMPAT |
|
9835
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
1061 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
|
1062 return listen(addr, port, listeners, { |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
1063 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
|
1064 tls_ctx = tls_ctx; |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
1065 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
|
1066 }); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1067 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1068 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1069 -- COMPAT |
|
11063
30d3f6f85eb8
net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents:
10681
diff
changeset
|
1070 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
|
1071 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
|
1072 client:updatenames(); |
|
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
1073 if not client.peername then |
|
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
1074 client.peername, client.peerport = addr, port; |
|
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
1075 end |
|
9473
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
1076 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
|
1077 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
|
1078 if tls_ctx then |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
1079 client:starttls(tls_ctx); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
1080 end |
|
7551
838212918f11
net.server_epoll: Rename arguments and varibles for consistensy
Kim Alvefur <zash@zash.se>
parents:
7550
diff
changeset
|
1081 return client; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1082 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1083 |
|
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
1084 -- 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
|
1085 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
|
1086 local create; |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
1087 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
|
1088 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
|
1089 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
|
1090 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
|
1091 typ = "tcp6"; |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
1092 else |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
1093 typ = "tcp4"; |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
1094 end |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
1095 end |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
1096 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
|
1097 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
|
1098 end |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
1099 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
|
1100 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
|
1101 end |
|
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
1102 local conn, err = create(); |
|
10082
1df53ef1f60d
net.server_epoll: Return errors from creating sockets
Kim Alvefur <zash@zash.se>
parents:
10081
diff
changeset
|
1103 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
|
1104 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
|
1105 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
|
1106 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
|
1107 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
|
1108 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
|
1109 end |
|
9499
36e379f058c8
net.server: Swich method for connecting sockets with remotes
Kim Alvefur <zash@zash.se>
parents:
9498
diff
changeset
|
1110 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
|
1111 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
|
1112 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
|
1113 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
|
1114 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
|
1115 -- 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
|
1116 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
|
1117 end |
|
9473
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
1118 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
|
1119 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
|
1120 if tls_ctx then |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
1121 client:starttls(tls_ctx); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
1122 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
|
1123 return client, conn; |
|
7553
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
1124 end |
|
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
1125 |
|
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
1126 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
|
1127 local conn = setmetatable({ |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1128 conn = fd; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1129 onreadable = onreadable; |
|
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
1130 onwritable = onwritable; |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1131 close = function (self) |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
1132 self:del(); |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1133 end |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1134 }, interface_mt); |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1135 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
|
1136 conn.getfd = function () |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1137 return fd; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1138 end; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1139 -- 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
|
1140 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
|
1141 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
|
1142 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
|
1143 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
|
1144 return conn; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1145 end; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1146 |
|
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
1147 -- 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
|
1148 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
|
1149 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
|
1150 function from:onincoming(data) |
|
cd669975031b
net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents:
10283
diff
changeset
|
1151 self:pause(); |
|
11805
2327e03d1f8d
net.server_epoll: Fix indentation messed up in last merge
Kim Alvefur <zash@zash.se>
parents:
11804
diff
changeset
|
1152 to:write(data); |
|
10284
cd669975031b
net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents:
10283
diff
changeset
|
1153 end |
|
10285
bcf61e22f841
net.server_epoll: Ignore unused self argument [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10284
diff
changeset
|
1154 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
|
1155 from:resume(); |
|
10284
cd669975031b
net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents:
10283
diff
changeset
|
1156 end |
|
10283
dff360d00dfa
net.server_epoll: Handle read size argument to link
Kim Alvefur <zash@zash.se>
parents:
10282
diff
changeset
|
1157 from:set_mode(read_size); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
1158 from:set(true, nil); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
1159 to:set(nil, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1160 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1161 |
|
9438
916bee81eb7e
net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents:
9432
diff
changeset
|
1162 -- COMPAT |
|
916bee81eb7e
net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents:
9432
diff
changeset
|
1163 -- 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
|
1164 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
|
1165 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1166 |
|
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
1167 -- 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
|
1168 local function closeall() |
|
7799
93643a61858a
server_epoll: Ignore unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7797
diff
changeset
|
1169 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
|
1170 conn:close(); |
|
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
1171 end |
|
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
1172 end |
|
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
1173 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1174 local quitting = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1175 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
1176 -- 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
|
1177 local function setquitting(quit) |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
1178 if quit then |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
1179 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
|
1180 closeall(); |
|
11810
fe0cdbad19c3
net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
1181 addtimer(1, function () |
|
fe0cdbad19c3
net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
1182 if quitting then |
|
fe0cdbad19c3
net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
1183 closeall(); |
|
fe0cdbad19c3
net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
1184 return 1; |
|
fe0cdbad19c3
net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
1185 end |
|
fe0cdbad19c3
net.server_epoll: Close sockets added after shutdown signal (fixes #1670)
Kim Alvefur <zash@zash.se>
parents:
11751
diff
changeset
|
1186 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
|
1187 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
|
1188 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
|
1189 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
|
1190 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
|
1191 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
|
1192 end |
|
ae43166fe931
net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents:
11810
diff
changeset
|
1193 end |
|
ae43166fe931
net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents:
11810
diff
changeset
|
1194 end); |
|
ae43166fe931
net.server_epoll: Add a hard deadline on shutdown to extra-fix #1670
Kim Alvefur <zash@zash.se>
parents:
11810
diff
changeset
|
1195 end |
|
7796
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
1196 else |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
1197 quitting = nil; |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
1198 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1199 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1200 |
|
12827
0605d4f03e25
net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents:
12594
diff
changeset
|
1201 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
|
1202 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
|
1203 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
|
1204 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
|
1205 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
|
1206 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
|
1207 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
|
1208 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
|
1209 end |
|
0605d4f03e25
net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents:
12594
diff
changeset
|
1210 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
|
1211 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
|
1212 end |
|
0605d4f03e25
net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents:
12594
diff
changeset
|
1213 else |
|
0605d4f03e25
net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents:
12594
diff
changeset
|
1214 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
|
1215 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
|
1216 end |
|
0605d4f03e25
net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents:
12594
diff
changeset
|
1217 else |
|
0605d4f03e25
net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents:
12594
diff
changeset
|
1218 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
|
1219 end |
|
0605d4f03e25
net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents:
12594
diff
changeset
|
1220 end |
|
0605d4f03e25
net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents:
12594
diff
changeset
|
1221 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
1222 -- 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
|
1223 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
|
1224 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
|
1225 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
|
1226 end |
|
0605d4f03e25
net.server_epoll: Factor out single main loop step into its own function
Kim Alvefur <zash@zash.se>
parents:
12594
diff
changeset
|
1227 |
|
12828
f33887f925e1
net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents:
12827
diff
changeset
|
1228 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
|
1229 while not quitting do |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
1230 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
|
1231 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
|
1232 t = 0; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1233 local conn = fds[fd]; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1234 if conn then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1235 if r then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1236 conn:onreadable(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1237 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1238 if w then |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
1239 conn:onwritable(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1240 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1241 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1242 log("debug", "Removing unknown fd %d", fd); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
1243 poll:del(fd); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1244 end |
|
12828
f33887f925e1
net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents:
12827
diff
changeset
|
1245 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
|
1246 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
|
1247 elseif r ~= "signal" then |
|
9445
af7eafe82447
net.server_epoll: Log error number from wait()
Kim Alvefur <zash@zash.se>
parents:
9441
diff
changeset
|
1248 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
|
1249 end |
|
12828
f33887f925e1
net.server_epoll: Remove delay on last main loop iteration when quitting
Kim Alvefur <zash@zash.se>
parents:
12827
diff
changeset
|
1250 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1251 return quitting; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1252 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1253 |
|
13440
b27de3d2bad6
net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents:
13422
diff
changeset
|
1254 local hook_signal; |
|
b27de3d2bad6
net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents:
13422
diff
changeset
|
1255 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
|
1256 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
|
1257 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
|
1258 end |
|
b27de3d2bad6
net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents:
13422
diff
changeset
|
1259 |
|
b27de3d2bad6
net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents:
13422
diff
changeset
|
1260 function hook_signal(signum, cb) |
|
13447
5c9df28a57bb
net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents:
13441
diff
changeset
|
1261 local sigfd = signal.signalfd(signum); |
|
5c9df28a57bb
net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents:
13441
diff
changeset
|
1262 if not sigfd then |
|
5c9df28a57bb
net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents:
13441
diff
changeset
|
1263 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
|
1264 return nil, "failed"; |
|
5c9df28a57bb
net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents:
13441
diff
changeset
|
1265 end |
|
5c9df28a57bb
net.server_epoll: Log failure to hook signals
Kim Alvefur <zash@zash.se>
parents:
13441
diff
changeset
|
1266 local watch = watchfd(sigfd, dispatch); |
|
13440
b27de3d2bad6
net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents:
13422
diff
changeset
|
1267 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
|
1268 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
|
1269 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
|
1270 return watch; |
|
b27de3d2bad6
net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents:
13422
diff
changeset
|
1271 end |
|
b27de3d2bad6
net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents:
13422
diff
changeset
|
1272 end |
|
b27de3d2bad6
net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents:
13422
diff
changeset
|
1273 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1274 return { |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1275 get_backend = function () return "epoll"; end; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1276 addserver = addserver; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1277 addclient = addclient; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1278 add_task = addtimer; |
|
10983
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
1279 timer = { |
|
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
1280 -- API-compatible with util.timer |
|
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
1281 add_task = addtimer; |
|
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
1282 stop = closetimer; |
|
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
1283 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
|
1284 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
|
1285 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
|
1286 end; |
|
10983
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
1287 }; |
|
9835
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
1288 listen = listen; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1289 loop = loop; |
|
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
1290 closeall = closeall; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1291 setquitting = setquitting; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1292 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
|
1293 wrapserver = wrapserver; |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
1294 watchfd = watchfd; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1295 link = link; |
|
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
1296 set_config = function (newconfig) |
|
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
1297 cfg = setmetatable(newconfig, default_config); |
|
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
1298 end; |
|
13440
b27de3d2bad6
net.server_epoll: Support hooking signals via signalfd
Kim Alvefur <zash@zash.se>
parents:
13422
diff
changeset
|
1299 hook_signal = hook_signal; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1300 |
|
12481
2ee27587fec7
net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents:
12480
diff
changeset
|
1301 tls_builder = function(basedir) |
|
2ee27587fec7
net: refactor sslconfig to not depend on LuaSec
Jonas Schäfer <jonas@wielicki.name>
parents:
12480
diff
changeset
|
1302 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
|
1303 end, |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1304 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1305 -- libevent emulation |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1306 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
|
1307 addevent = function (fd, mode, callback) |
|
10088
97da8452c6a6
net.server_epoll: Deprecate libevent emulation layer
Kim Alvefur <zash@zash.se>
parents:
10082
diff
changeset
|
1308 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
|
1309 local function onevent(self) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1310 local ret = self:callback(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1311 if ret == -1 then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
1312 self:set(false, false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1313 elseif ret then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
1314 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
|
1315 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1316 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1317 |
|
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
1318 local conn = setmetatable({ |
|
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
1319 getfd = function () return fd; end; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1320 callback = callback; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1321 onreadable = onevent; |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
1322 onwritable = onevent; |
|
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
1323 close = function (self) |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
1324 self:del(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1325 fds[fd] = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1326 end; |
|
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
1327 }, 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
|
1328 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
|
1329 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
|
1330 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
|
1331 if not ok then return ok, err; end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1332 return conn; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1333 end; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1334 }; |
