Annotate

net/server_epoll.lua @ 13574:f29d15aef6f8

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