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