Software / code / prosody
Annotate
net/server_epoll.lua @ 9781:161411a41377
util.prosodyctl: Allow passing path to Lua runtime to the start() function
By default the shebang is used. Being able to override it is useful in
cases where the shebang does not match the configured runtime.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 10 Jan 2019 14:57:26 +0100 |
| parent | 9696:ed0917381b4d |
| child | 9823:b61ba4496923 |
| rev | line source |
|---|---|
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 -- Prosody IM |
|
9474
619ba78709a5
net.server_epoll: Update copyright year
Kim Alvefur <zash@zash.se>
parents:
9473
diff
changeset
|
2 -- Copyright (C) 2016-2018 Kim Alvefur |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 -- |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 -- This project is MIT/X11 licensed. Please see the |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 -- COPYING file in the source package for more information. |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 -- |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 local t_sort = table.sort; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 local t_insert = table.insert; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 local t_remove = table.remove; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 local t_concat = table.concat; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 local setmetatable = setmetatable; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 local tostring = tostring; |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
15 local pcall = pcall; |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
16 local type = type; |
|
7797
d0c32d86724f
server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents:
7796
diff
changeset
|
17 local next = next; |
|
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
18 local pairs = pairs; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 local log = require "util.logger".init("server_epoll"); |
|
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"; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 local gettime = require "util.time".now; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 local createtable = require "util.table".create; |
|
9473
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
24 local inet = require "util.net"; |
|
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
25 local inet_pton = inet.pton; |
|
7737
f93b3083b46b
net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents:
7707
diff
changeset
|
26 local _SOCKETINVALID = socket._SOCKETINVALID or -1; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
|
9506
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
28 local poller = require "util.poll" |
|
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
29 local EEXIST = poller.EEXIST; |
|
9507
33d21f020b66
net.server_epoll: Ignore ENOENT when deregitering socket
Kim Alvefur <zash@zash.se>
parents:
9506
diff
changeset
|
30 local ENOENT = poller.ENOENT; |
|
9506
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
31 |
|
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
32 local poll = assert(poller.new()); |
|
7601
ce20546d7714
net.server_epoll: Make sure a recent LuaSocket is avaliable
Kim Alvefur <zash@zash.se>
parents:
7600
diff
changeset
|
33 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 local _ENV = nil; |
|
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8552
diff
changeset
|
35 -- luacheck: std none |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 |
|
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
37 local default_config = { __index = { |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
38 -- If a connection is silent for this long, close it unless onreadtimeout says not to |
|
8983
23f66f04e216
net.server: Set default read timeout to 14 minutes (fixes #971)
Kim Alvefur <zash@zash.se>
parents:
8781
diff
changeset
|
39 read_timeout = 14 * 60; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
40 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
41 -- How long to wait for a socket to become writable after queuing data to send |
|
9663
1e63903d8a1e
server_epoll: Increase write timeout
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
42 write_timeout = 60; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
43 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
44 -- Some number possibly influencing how many pending connections can be accepted |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 tcp_backlog = 128; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
46 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
47 -- If accepting a new incoming connection fails, wait this long before trying again |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 accept_retry_interval = 10; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
49 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
50 -- If there is still more data to read from LuaSocktes buffer, wait this long and read again |
|
7560
785fa1138293
net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents:
7559
diff
changeset
|
51 read_retry_delay = 1e-06; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
52 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
53 -- Size of chunks to read from sockets |
|
9311
9b0604fe01f1
net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents:
9310
diff
changeset
|
54 read_size = 8192; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
55 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
56 -- Timeout used during between steps in TLS handshakes |
|
7598
335b5ce06062
net.server_epoll: TLS handshake timeout
Kim Alvefur <zash@zash.se>
parents:
7597
diff
changeset
|
57 handshake_timeout = 60; |
|
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
58 |
|
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
59 -- Maximum and minimum amount of time to sleep waiting for events (adjusted for pending timers) |
|
7623
a1c040a5754f
net.server_epoll: Make maximum wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7606
diff
changeset
|
60 max_wait = 86400; |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
61 min_wait = 1e-06; |
|
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
62 }}; |
|
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
63 local cfg = default_config.__index; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 local fds = createtable(10, 0); -- FD -> conn |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
66 |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
67 -- Timer and scheduling -- |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
68 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 local timers = {}; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 local function noop() end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 local function closetimer(t) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 t[1] = 0; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 t[2] = noop; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
77 -- Set to true when timers have changed |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 local resort_timers = false; |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
79 |
|
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
80 -- Add absolute timer |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 local function at(time, f) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 local timer = { time, f, close = closetimer }; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 t_insert(timers, timer); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 resort_timers = true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 return timer; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 end |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
87 |
|
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
88 -- Add relative timer |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 local function addtimer(timeout, f) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 return at(gettime() + timeout, f); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
93 -- Run callbacks of expired timers |
|
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
94 -- Return time until next timeout |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
95 local function runtimers(next_delay, min_wait) |
|
7629
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
96 -- Any timers at all? |
|
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
97 if not timers[1] then |
|
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
98 return next_delay; |
|
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
99 end |
|
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
100 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 if resort_timers then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 -- Sort earliest timers to the end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 t_sort(timers, function (a, b) return a[1] > b[1]; end); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 resort_timers = false; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 -- Iterate from the end and remove completed timers |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 for i = #timers, 1, -1 do |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 local timer = timers[i]; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 local t, f = timer[1], timer[2]; |
| 7624 | 111 -- Get time for every iteration to increase accuracy |
| 112 local now = gettime(); | |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 if t > now then |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
114 -- This timer should not fire yet |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 local diff = t - now; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 if diff < next_delay then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 next_delay = diff; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 end |
|
7558
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
119 break; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 local new_timeout = f(now); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
122 if new_timeout then |
|
9587
42eedef517dc
net.server_epoll: Reschedule delayed timers relative to current time
Kim Alvefur <zash@zash.se>
parents:
9581
diff
changeset
|
123 -- Schedule for 'delay' from the time actually scheduled, not from now, |
|
42eedef517dc
net.server_epoll: Reschedule delayed timers relative to current time
Kim Alvefur <zash@zash.se>
parents:
9581
diff
changeset
|
124 -- in order to prevent timer drift, unless it already drifted way out of sync. |
|
42eedef517dc
net.server_epoll: Reschedule delayed timers relative to current time
Kim Alvefur <zash@zash.se>
parents:
9581
diff
changeset
|
125 if (t + new_timeout) > ( now - new_timeout ) then |
|
42eedef517dc
net.server_epoll: Reschedule delayed timers relative to current time
Kim Alvefur <zash@zash.se>
parents:
9581
diff
changeset
|
126 timer[1] = t + new_timeout; |
|
42eedef517dc
net.server_epoll: Reschedule delayed timers relative to current time
Kim Alvefur <zash@zash.se>
parents:
9581
diff
changeset
|
127 else |
|
42eedef517dc
net.server_epoll: Reschedule delayed timers relative to current time
Kim Alvefur <zash@zash.se>
parents:
9581
diff
changeset
|
128 timer[1] = now + new_timeout; |
|
42eedef517dc
net.server_epoll: Reschedule delayed timers relative to current time
Kim Alvefur <zash@zash.se>
parents:
9581
diff
changeset
|
129 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
130 resort_timers = true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
132 t_remove(timers, i); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
134 end |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
135 |
|
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
136 if resort_timers or next_delay < min_wait then |
|
7558
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
137 -- Timers may be added from within a timer callback. |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
138 -- Those would not be considered for next_delay, |
|
7558
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
139 -- and we might sleep for too long, so instead |
|
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
140 -- we return a shorter timeout so we can |
|
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
141 -- properly sort all new timers. |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
142 next_delay = min_wait; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
143 end |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
144 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
145 return next_delay; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
146 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
148 -- Socket handler interface |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
149 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 local interface = {}; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 local interface_mt = { __index = interface }; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
153 function interface_mt:__tostring() |
|
7585
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
154 if self.sockname and self.peername then |
|
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
155 return ("FD %d (%s, %d, %s, %d)"):format(self:getfd(), self.peername, self.peerport, self.sockname, self.sockport); |
|
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
156 elseif self.sockname or self.peername then |
|
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
157 return ("FD %d (%s, %d)"):format(self:getfd(), self.sockname or self.peername, self.sockport or self.peerport); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 end |
|
9321
146dc1e4c7ff
net.server_epoll: Simplify minimal string representation
Kim Alvefur <zash@zash.se>
parents:
9320
diff
changeset
|
159 return ("FD %d"):format(self:getfd()); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
162 -- Replace the listener and tell the old one |
|
9387
33e52f727f0f
net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents:
9385
diff
changeset
|
163 function interface:setlistener(listeners, data) |
|
7604
36408ef6c8c9
net.server_epoll: Call ondetach when listeners are replaced
Kim Alvefur <zash@zash.se>
parents:
7603
diff
changeset
|
164 self:on("detach"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
165 self.listeners = listeners; |
|
9387
33e52f727f0f
net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents:
9385
diff
changeset
|
166 self:on("attach", data); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
167 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
168 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
169 -- Call a listener callback |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
170 function interface:on(what, ...) |
|
8006
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
171 if not self.listeners then |
|
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
172 log("error", "%s has no listeners", self); |
|
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
173 return; |
|
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
174 end |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
175 local listener = self.listeners["on"..what]; |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
176 if not listener then |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
177 -- log("debug", "Missing listener 'on%s'", what); -- uncomment for development and debugging |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
178 return; |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
179 end |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
180 local ok, err = pcall(listener, self, ...); |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
181 if not ok then |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
182 log("error", "Error calling on%s: %s", what, err); |
|
9696
ed0917381b4d
net.server_epoll: Bail on callback error
Kim Alvefur <zash@zash.se>
parents:
9695
diff
changeset
|
183 return; |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
184 end |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
185 return err; |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
186 end |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
187 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
188 -- Return the file descriptor number |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
189 function interface:getfd() |
|
7586
846fdbbc62ba
net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents:
7585
diff
changeset
|
190 if self.conn then |
|
846fdbbc62ba
net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents:
7585
diff
changeset
|
191 return self.conn:getfd(); |
|
846fdbbc62ba
net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents:
7585
diff
changeset
|
192 end |
|
7737
f93b3083b46b
net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents:
7707
diff
changeset
|
193 return _SOCKETINVALID; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
194 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
195 |
|
8271
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
196 function interface:server() |
|
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
197 return self._server or self; |
|
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
198 end |
|
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
199 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
200 -- Get IP address |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
201 function interface:ip() |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
202 return self.peername or self.sockname; |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
203 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
204 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
205 -- Get a port number, doesn't matter which |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
206 function interface:port() |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
207 return self.sockport or self.peerport; |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
208 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
209 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
210 -- Get local port number |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
211 function interface:clientport() |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
212 return self.sockport; |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
213 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
214 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
215 -- Get remote port |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
216 function interface:serverport() |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
217 if self.sockport then |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
218 return self.sockport; |
|
8271
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
219 elseif self._server then |
|
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
220 self._server:port(); |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
221 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
222 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
223 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
224 -- Return underlying socket |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
225 function interface:socket() |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
226 return self.conn; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
227 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
228 |
|
7910
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
229 function interface:set_mode(new_mode) |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
230 self.read_size = new_mode; |
|
7910
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
231 end |
|
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
232 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
233 function interface:setoption(k, v) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
234 -- LuaSec doesn't expose setoption :( |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
235 if self.conn.setoption then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
236 self.conn:setoption(k, v); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
237 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
238 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
239 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
240 -- Timeout for detecting dead or idle sockets |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
241 function interface:setreadtimeout(t) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
242 if t == false then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
243 if self._readtimeout then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
244 self._readtimeout:close(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
245 self._readtimeout = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
246 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
247 return |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
248 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
249 t = t or cfg.read_timeout; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
250 if self._readtimeout then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
251 self._readtimeout[1] = gettime() + t; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
252 resort_timers = true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
253 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
254 self._readtimeout = addtimer(t, function () |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
255 if self:on("readtimeout") then |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
256 return cfg.read_timeout; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
257 else |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
258 self:on("disconnect", "read timeout"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
259 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
260 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
261 end); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
262 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
263 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
264 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
265 -- Timeout for detecting dead sockets |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
266 function interface:setwritetimeout(t) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
267 if t == false then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
268 if self._writetimeout then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
269 self._writetimeout:close(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
270 self._writetimeout = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
271 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
272 return |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
273 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
274 t = t or cfg.write_timeout; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
275 if self._writetimeout then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
276 self._writetimeout[1] = gettime() + t; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
277 resort_timers = true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
278 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
279 self._writetimeout = addtimer(t, function () |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
280 self:on("disconnect", "write timeout"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
281 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
282 end); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
283 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
284 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
285 |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
286 function interface:add(r, w) |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
287 local fd = self:getfd(); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
288 if fd < 0 then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
289 return nil, "invalid fd"; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
290 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
291 if r == nil then r = self._wantread; end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
292 if w == nil then w = self._wantwrite; end |
|
9384
5c8006ce8cb8
net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents:
9383
diff
changeset
|
293 local ok, err, errno = poll:add(fd, r, w); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
294 if not ok then |
|
9506
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
295 if errno == EEXIST then |
|
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
296 log("debug", "%s already registered!", self); |
|
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
297 return self:set(r, w); -- So try to change its flags |
|
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
298 end |
|
9441
116a9d0a295c
net.server_epoll: Pass error number to logging
Kim Alvefur <zash@zash.se>
parents:
9439
diff
changeset
|
299 log("error", "Could not register %s: %s(%d)", self, err, errno); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
300 return ok, err; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
301 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
302 self._wantread, self._wantwrite = r, w; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
303 fds[fd] = self; |
|
9381
80be543a3785
net.server_epoll: Watching instead of registering, seems more understandable
Kim Alvefur <zash@zash.se>
parents:
9321
diff
changeset
|
304 log("debug", "Watching %s", self); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
305 return true; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
306 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
307 |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
308 function interface:set(r, w) |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
309 local fd = self:getfd(); |
|
7602
a4d5eec36a17
net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents:
7601
diff
changeset
|
310 if fd < 0 then |
|
a4d5eec36a17
net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents:
7601
diff
changeset
|
311 return nil, "invalid fd"; |
|
a4d5eec36a17
net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents:
7601
diff
changeset
|
312 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
313 if r == nil then r = self._wantread; end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
314 if w == nil then w = self._wantwrite; end |
|
9384
5c8006ce8cb8
net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents:
9383
diff
changeset
|
315 local ok, err, errno = poll:set(fd, r, w); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
316 if not ok then |
|
9384
5c8006ce8cb8
net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents:
9383
diff
changeset
|
317 log("error", "Could not update poller state %s: %s(%d)", self, err, errno); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
318 return ok, err; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
319 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
320 self._wantread, self._wantwrite = r, w; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
321 return true; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
322 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
323 |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
324 function interface:del() |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
325 local fd = self:getfd(); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
326 if fd < 0 then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
327 return nil, "invalid fd"; |
|
7625
6afafd6d4ef0
net.server_epoll: Move management of fd registry to :setflags
Kim Alvefur <zash@zash.se>
parents:
7624
diff
changeset
|
328 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
329 if fds[fd] ~= self then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
330 return nil, "unregistered fd"; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
331 end |
|
9384
5c8006ce8cb8
net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents:
9383
diff
changeset
|
332 local ok, err, errno = poll:del(fd); |
|
9507
33d21f020b66
net.server_epoll: Ignore ENOENT when deregitering socket
Kim Alvefur <zash@zash.se>
parents:
9506
diff
changeset
|
333 if not ok and errno ~= ENOENT then |
|
9384
5c8006ce8cb8
net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents:
9383
diff
changeset
|
334 log("error", "Could not unregister %s: %s(%d)", self, err, errno); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
335 return ok, err; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
336 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
337 self._wantread, self._wantwrite = nil, nil; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
338 fds[fd] = nil; |
|
9381
80be543a3785
net.server_epoll: Watching instead of registering, seems more understandable
Kim Alvefur <zash@zash.se>
parents:
9321
diff
changeset
|
339 log("debug", "Unwatched %s", self); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
340 return true; |
|
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 |
|
9320
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
343 function interface:setflags(r, w) |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
344 if not(self._wantread or self._wantwrite) then |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
345 if not(r or w) then |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
346 return true; -- no change |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
347 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
348 return self:add(r, w); |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
349 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
350 if not(r or w) then |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
351 return self:del(); |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
352 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
353 return self:set(r, w); |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
354 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
355 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
356 -- Called when socket is readable |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
357 function interface:onreadable() |
|
9311
9b0604fe01f1
net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents:
9310
diff
changeset
|
358 local data, err, partial = self.conn:receive(self.read_size or cfg.read_size); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
359 if data then |
|
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
360 self:onconnect(); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
361 self:on("incoming", data); |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
362 else |
|
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
363 if partial and partial ~= "" then |
|
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
364 self:onconnect(); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
365 self:on("incoming", partial, err); |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
366 end |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
367 if err == "wantread" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
368 self:set(true, nil); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
369 elseif err == "wantwrite" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
370 self:set(nil, true); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
371 elseif err ~= "timeout" then |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
372 self:on("disconnect", err); |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
373 self:destroy() |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
374 return; |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
375 end |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
376 end |
|
7691
a5ad858f3a93
net.server_epoll: Check that connection still exists after callback, fixes traceback when closed
Kim Alvefur <zash@zash.se>
parents:
7687
diff
changeset
|
377 if not self.conn then return; end |
|
7606
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
378 if self.conn:dirty() then |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
379 self:setreadtimeout(false); |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
380 self:pausefor(cfg.read_retry_delay); |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
381 else |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
382 self:setreadtimeout(); |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
383 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
384 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
385 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
386 -- Called when socket is writable |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
387 function interface:onwritable() |
|
8552
1fcefc16a55d
server_epoll: Onconnect should happen before first attempt to write to socket
Kim Alvefur <zash@zash.se>
parents:
8542
diff
changeset
|
388 self:onconnect(); |
|
8776
e7d4344e0fea
net.server_epoll: Handle connection being closed and destroyed in onconnect callback
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
389 if not self.conn then return; end -- could have been closed in onconnect |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
390 local buffer = self.writebuffer; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
391 local data = t_concat(buffer); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
392 local ok, err, partial = self.conn:send(data); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
393 if ok then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
394 self:set(nil, false); |
|
8541
8186114329d6
net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents:
8540
diff
changeset
|
395 for i = #buffer, 1, -1 do |
|
8186114329d6
net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents:
8540
diff
changeset
|
396 buffer[i] = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
397 end |
|
8541
8186114329d6
net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents:
8540
diff
changeset
|
398 self:setwritetimeout(false); |
|
8186114329d6
net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents:
8540
diff
changeset
|
399 self:ondrain(); -- Be aware of writes in ondrain |
|
7589
125e4f2e0b65
net.server_epoll: Return early on successful write
Kim Alvefur <zash@zash.se>
parents:
7588
diff
changeset
|
400 return; |
|
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
401 elseif partial then |
|
7591
138f16eb39fb
net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents:
7590
diff
changeset
|
402 buffer[1] = data:sub(partial+1); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
403 for i = #buffer, 2, -1 do |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
404 buffer[i] = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
405 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
406 self:setwritetimeout(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
407 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
408 if err == "wantwrite" or err == "timeout" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
409 self:set(nil, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
410 elseif err == "wantread" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
411 self:set(true, nil); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
412 elseif err ~= "timeout" then |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
413 self:on("disconnect", err); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
414 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
415 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
416 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
417 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
418 -- The write buffer has been successfully emptied |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
419 function interface:ondrain() |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
420 return self:on("drain"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
421 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
422 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
423 -- Add data to write buffer and set flag for wanting to write |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
424 function interface:write(data) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
425 local buffer = self.writebuffer; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
426 if buffer then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
427 t_insert(buffer, data); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
428 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
429 self.writebuffer = { data }; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
430 end |
|
9581
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
431 if not self._write_lock then |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
432 self:setwritetimeout(); |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
433 self:set(nil, true); |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
434 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
435 return #data; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
436 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
437 interface.send = interface.write; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
438 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
439 -- Close, possibly after writing is done |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
440 function interface:close() |
|
8007
67f8954875a4
net.server_epoll: Check write buffer for remaining data to write when closing
Kim Alvefur <zash@zash.se>
parents:
8006
diff
changeset
|
441 if self.writebuffer and self.writebuffer[1] then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
442 self:set(false, true); -- Flush final buffer contents |
|
7593
0266434d7df1
net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents:
7592
diff
changeset
|
443 self.write, self.send = noop, noop; -- No more writing |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
444 log("debug", "Close %s after writing", self); |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
445 self.ondrain = interface.close; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
446 else |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
447 log("debug", "Close %s now", self); |
|
7593
0266434d7df1
net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents:
7592
diff
changeset
|
448 self.write, self.send = noop, noop; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
449 self.close = noop; |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
450 self:on("disconnect"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
451 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
452 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
453 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
454 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
455 function interface:destroy() |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
456 self:del(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
457 self:setwritetimeout(false); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
458 self:setreadtimeout(false); |
|
7594
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
459 self.onreadable = noop; |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
460 self.onwritable = noop; |
|
7594
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
461 self.destroy = noop; |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
462 self.close = noop; |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
463 self.on = noop; |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
464 self.conn:close(); |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
465 self.conn = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
466 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
467 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
468 function interface:ssl() |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
469 return self._tls; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
470 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
471 |
|
9300
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
472 function interface:starttls(tls_ctx) |
|
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
473 if tls_ctx then self.tls_ctx = tls_ctx; end |
|
9430
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
474 self.starttls = false; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
475 if self.writebuffer and self.writebuffer[1] then |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
476 log("debug", "Start TLS on %s after write", self); |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
477 self.ondrain = interface.starttls; |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
478 self:set(nil, true); -- make sure wantwrite is set |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
479 else |
|
9430
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
480 if self.ondrain == interface.starttls then |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
481 self.ondrain = nil; |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
482 end |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
483 self.onwritable = interface.tlshandskake; |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
484 self.onreadable = interface.tlshandskake; |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
485 self:set(true, true); |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
486 log("debug", "Prepare to start TLS on %s", self); |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
487 end |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
488 end |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
489 |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
490 function interface:tlshandskake() |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
491 self:setwritetimeout(false); |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
492 self:setreadtimeout(false); |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
493 if not self._tls then |
|
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
494 self._tls = true; |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
495 log("debug", "Start TLS on %s now", self); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
496 self:del(); |
|
9431
c3c0523a37c6
net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents:
9430
diff
changeset
|
497 local ok, conn, err = pcall(luasec.wrap, self.conn, self.tls_ctx); |
|
c3c0523a37c6
net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents:
9430
diff
changeset
|
498 if not ok then |
|
c3c0523a37c6
net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents:
9430
diff
changeset
|
499 conn, err = ok, conn; |
|
9573
57637247356d
net.server_epoll: Shuffle variables earlier to improve readability
Kim Alvefur <zash@zash.se>
parents:
9508
diff
changeset
|
500 log("error", "Failed to initialize TLS: %s", err); |
|
9431
c3c0523a37c6
net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents:
9430
diff
changeset
|
501 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
502 if not conn then |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
503 self:on("disconnect", err); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
504 self:destroy(); |
|
7595
166b2e0766a4
net.server_epoll: Return status from starttls method
Kim Alvefur <zash@zash.se>
parents:
7594
diff
changeset
|
505 return conn, err; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
506 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
507 conn:settimeout(0); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
508 self.conn = conn; |
|
9430
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
509 self:on("starttls"); |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
510 self.ondrain = nil; |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
511 self.onwritable = interface.tlshandskake; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
512 self.onreadable = interface.tlshandskake; |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
513 return self:init(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
514 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
515 local ok, err = self.conn:dohandshake(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
516 if ok then |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
517 log("debug", "TLS handshake on %s complete", self); |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
518 self.onwritable = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
519 self.onreadable = nil; |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
520 self:on("status", "ssl-handshake-complete"); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
521 self:setwritetimeout(); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
522 self:set(true, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
523 elseif err == "wantread" then |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
524 log("debug", "TLS handshake on %s to wait until readable", self); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
525 self:set(true, false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
526 self:setreadtimeout(cfg.handshake_timeout); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
527 elseif err == "wantwrite" then |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
528 log("debug", "TLS handshake on %s to wait until writable", self); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
529 self:set(false, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
530 self:setwritetimeout(cfg.handshake_timeout); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
531 else |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
532 log("debug", "TLS handshake error on %s: %s", self, err); |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
533 self:on("disconnect", err); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
534 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
535 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
536 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
537 |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
538 local function wrapsocket(client, server, read_size, listeners, tls_ctx) -- luasocket object -> interface object |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
539 client:settimeout(0); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
540 local conn = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
541 conn = client; |
|
8271
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
542 _server = server; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
543 created = gettime(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
544 listeners = listeners; |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
545 read_size = read_size or (server and server.read_size); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
546 writebuffer = {}; |
|
9432
2e3f66475cc8
net.server_epoll: Inherit Direct TLS flag from servers to their clients
Kim Alvefur <zash@zash.se>
parents:
9431
diff
changeset
|
547 tls_ctx = tls_ctx or (server and server.tls_ctx); |
|
2e3f66475cc8
net.server_epoll: Inherit Direct TLS flag from servers to their clients
Kim Alvefur <zash@zash.se>
parents:
9431
diff
changeset
|
548 tls_direct = server and server.tls_direct; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
549 }, interface_mt); |
|
7591
138f16eb39fb
net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents:
7590
diff
changeset
|
550 |
|
9383
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
551 conn:updatenames(); |
|
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
552 return conn; |
|
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
553 end |
|
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
554 |
|
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
555 function interface:updatenames() |
|
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
556 local conn = self.conn; |
|
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
557 local ok, peername, peerport = pcall(conn.getpeername, conn); |
|
9382
31a2be28729c
net.server_epoll: Protect from errors in get{peer,sock}name
Kim Alvefur <zash@zash.se>
parents:
9381
diff
changeset
|
558 if ok then |
|
9383
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
559 self.peername, self.peerport = peername, peerport; |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
560 end |
|
9383
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
561 local ok, sockname, sockport = pcall(conn.getsockname, conn); |
|
9382
31a2be28729c
net.server_epoll: Protect from errors in get{peer,sock}name
Kim Alvefur <zash@zash.se>
parents:
9381
diff
changeset
|
562 if ok then |
|
9383
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
563 self.sockname, self.sockport = sockname, sockport; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
564 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
565 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
566 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
567 -- A server interface has new incoming connections waiting |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
568 -- This replaces the onreadable callback |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
569 function interface:onacceptable() |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
570 local conn, err = self.conn:accept(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
571 if not conn then |
|
7574
97b8506118a9
net.server_epoll: Fix missing quotes in logging call
Kim Alvefur <zash@zash.se>
parents:
7573
diff
changeset
|
572 log("debug", "Error accepting new client: %s, server will be paused for %ds", err, cfg.accept_retry_interval); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
573 self:pausefor(cfg.accept_retry_interval); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
574 return; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
575 end |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
576 local client = wrapsocket(conn, self, nil, self.listeners); |
|
7592
10d2f008321d
net.server_epoll: Additional logging of connects and TLS
Kim Alvefur <zash@zash.se>
parents:
7591
diff
changeset
|
577 log("debug", "New connection %s", tostring(client)); |
|
9430
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
578 client:init(); |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
579 if self.tls_direct then |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
580 client:starttls(self.tls_ctx); |
|
9695
5ec4eaf76de8
net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents:
9666
diff
changeset
|
581 else |
|
5ec4eaf76de8
net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents:
9666
diff
changeset
|
582 client:onconnect(); |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
583 end |
|
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
584 end |
|
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
585 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
586 -- Initialization |
|
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
587 function interface:init() |
|
9306
35c128b42509
net.server_epoll: Factor Direct TLS handling out of connection initialization
Kim Alvefur <zash@zash.se>
parents:
9301
diff
changeset
|
588 self:setwritetimeout(); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
589 return self:add(true, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
590 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
591 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
592 function interface:pause() |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
593 return self:set(false); |
|
7547
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:resume() |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
597 return self:set(true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
598 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
599 |
| 7624 | 600 -- Pause connection for some time |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
601 function interface:pausefor(t) |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
602 if self._pausefor then |
|
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
603 self._pausefor:close(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
604 end |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
605 if t == false then return; end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
606 self:set(false); |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
607 self._pausefor = addtimer(t, function () |
|
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
608 self._pausefor = nil; |
|
7707
7bb1cc7278b6
net.server_epoll: Make sure socket exists before checking if there is buffered data in it
Kim Alvefur <zash@zash.se>
parents:
7691
diff
changeset
|
609 if self.conn and self.conn:dirty() then |
|
7560
785fa1138293
net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents:
7559
diff
changeset
|
610 self:onreadable(); |
|
785fa1138293
net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents:
7559
diff
changeset
|
611 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
612 self:set(true); |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
613 end); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
614 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
615 |
|
9581
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
616 function interface:pause_writes() |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
617 self._write_lock = true; |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
618 self:setwritetimeout(false); |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
619 self:set(nil, false); |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
620 end |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
621 |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
622 function interface:resume_writes() |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
623 self._write_lock = nil; |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
624 if self.writebuffer[1] then |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
625 self:setwritetimeout(); |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
626 self:set(nil, true); |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
627 end |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
628 end |
|
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
629 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
630 -- Connected! |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
631 function interface:onconnect() |
|
9594
dcf466e04f81
net.server_epoll: Use method to update peername on connect
Kim Alvefur <zash@zash.se>
parents:
9587
diff
changeset
|
632 self:updatenames(); |
|
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
633 self.onconnect = noop; |
|
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
634 self:on("connect"); |
|
8506
174fd716c9fa
server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents:
8271
diff
changeset
|
635 end |
|
174fd716c9fa
server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents:
8271
diff
changeset
|
636 |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
637 local function addserver(addr, port, listeners, read_size, tls_ctx) |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
638 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
|
639 if not conn then return conn, err; end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
640 conn:settimeout(0); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
641 local server = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
642 conn = conn; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
643 created = gettime(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
644 listeners = listeners; |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
645 read_size = read_size; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
646 onreadable = interface.onacceptable; |
|
9300
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
647 tls_ctx = tls_ctx; |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
648 tls_direct = tls_ctx and true or false; |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
649 sockname = addr; |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
650 sockport = port; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
651 }, interface_mt); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
652 server:add(true, false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
653 return server; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
654 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
655 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
656 -- COMPAT |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
657 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx) |
|
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
658 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx); |
|
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
659 if not client.peername then |
|
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
660 client.peername, client.peerport = addr, port; |
|
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
661 end |
|
9473
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
662 local ok, err = client:init(); |
|
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
663 if not ok then return ok, err; end |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
664 if tls_ctx then |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
665 client:starttls(tls_ctx); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
666 end |
|
7551
838212918f11
net.server_epoll: Rename arguments and varibles for consistensy
Kim Alvefur <zash@zash.se>
parents:
7550
diff
changeset
|
667 return client; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
668 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
669 |
|
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
670 -- New outgoing TCP connection |
|
9497
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
671 local function addclient(addr, port, listeners, read_size, tls_ctx, typ) |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
672 local create; |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
673 if not typ then |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
674 local n = inet_pton(addr); |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
675 if not n then return nil, "invalid-ip"; end |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
676 if #n == 16 then |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
677 typ = "tcp6"; |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
678 else |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
679 typ = "tcp4"; |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
680 end |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
681 end |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
682 if typ then |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
683 create = socket[typ]; |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
684 end |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
685 if type(create) ~= "function" then |
|
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
686 return nil, "invalid socket type"; |
|
9473
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
687 end |
|
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
688 local conn, err = create(); |
|
9498
cc593002f2e2
net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents:
9497
diff
changeset
|
689 local ok, err = conn:settimeout(0); |
|
cc593002f2e2
net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents:
9497
diff
changeset
|
690 if not ok then return ok, err; end |
|
9499
36e379f058c8
net.server: Swich method for connecting sockets with remotes
Kim Alvefur <zash@zash.se>
parents:
9498
diff
changeset
|
691 local ok, err = conn:setpeername(addr, port); |
|
9498
cc593002f2e2
net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents:
9497
diff
changeset
|
692 if not ok and err ~= "timeout" then return ok, err; end |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
693 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx) |
|
9473
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
694 local ok, err = client:init(); |
|
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
695 if not ok then return ok, err; end |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
696 if tls_ctx then |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
697 client:starttls(tls_ctx); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
698 end |
|
7556
1f777b38b66c
net.server_epoll: Make addclient conform to API (expected by net.http.request)
Kim Alvefur <zash@zash.se>
parents:
7555
diff
changeset
|
699 return client, conn; |
|
7553
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
700 end |
|
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
701 |
|
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
702 local function watchfd(fd, onreadable, onwritable) |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
703 local conn = setmetatable({ |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
704 conn = fd; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
705 onreadable = onreadable; |
|
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
706 onwritable = onwritable; |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
707 close = function (self) |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
708 self:del(); |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
709 end |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
710 }, interface_mt); |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
711 if type(fd) == "number" then |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
712 conn.getfd = function () |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
713 return fd; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
714 end; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
715 -- Otherwise it'll need to be something LuaSocket-compatible |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
716 end |
|
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
717 conn:add(onreadable, onwritable); |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
718 return conn; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
719 end; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
720 |
|
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
721 -- Dump all data from one connection into another |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
722 local function link(from, to) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
723 from.listeners = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
724 onincoming = function (_, data) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
725 from:pause(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
726 to:write(data); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
727 end, |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
728 }, {__index=from.listeners}); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
729 to.listeners = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
730 ondrain = function () |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
731 from:resume(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
732 end, |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
733 }, {__index=to.listeners}); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
734 from:set(true, nil); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
735 to:set(nil, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
736 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
737 |
|
9438
916bee81eb7e
net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents:
9432
diff
changeset
|
738 -- COMPAT |
|
916bee81eb7e
net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents:
9432
diff
changeset
|
739 -- net.adns calls this but then replaces :send so this can be a noop |
|
9439
988392a56495
net.server_epoll: Fix luacheck annotation
Kim Alvefur <zash@zash.se>
parents:
9438
diff
changeset
|
740 function interface:set_send(new_send) -- luacheck: ignore 212 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
741 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
742 |
|
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
743 -- Close all connections and servers |
|
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
744 local function closeall() |
|
7799
93643a61858a
server_epoll: Ignore unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7797
diff
changeset
|
745 for fd, conn in pairs(fds) do -- luacheck: ignore 213/fd |
|
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
746 conn:close(); |
|
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
747 end |
|
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
748 end |
|
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
749 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
750 local quitting = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
751 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
752 -- Signal main loop about shutdown via above upvalue |
|
7796
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
753 local function setquitting(quit) |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
754 if quit then |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
755 quitting = "quitting"; |
|
7797
d0c32d86724f
server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents:
7796
diff
changeset
|
756 closeall(); |
|
7796
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
757 else |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
758 quitting = nil; |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
759 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
760 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
761 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
762 -- Main loop |
|
7795
03081bd5c5bb
net.server_epoll: Add the 'once' argument to loop for parity with server_select
Kim Alvefur <zash@zash.se>
parents:
7794
diff
changeset
|
763 local function loop(once) |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
764 repeat |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
765 local t = runtimers(cfg.max_wait, cfg.min_wait); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
766 local fd, r, w = poll:wait(t); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
767 if fd then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
768 local conn = fds[fd]; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
769 if conn then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
770 if r then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
771 conn:onreadable(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
772 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
773 if w then |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
774 conn:onwritable(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
775 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
776 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
777 log("debug", "Removing unknown fd %d", fd); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
778 poll:del(fd); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
779 end |
|
9508
2055b497b515
net.server_epoll: Special handling of signal interrupts
Kim Alvefur <zash@zash.se>
parents:
9507
diff
changeset
|
780 elseif r ~= "timeout" and r ~= "signal" then |
|
9445
af7eafe82447
net.server_epoll: Log error number from wait()
Kim Alvefur <zash@zash.se>
parents:
9441
diff
changeset
|
781 log("debug", "epoll_wait error: %s[%d]", r, w); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
782 end |
|
7797
d0c32d86724f
server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents:
7796
diff
changeset
|
783 until once or (quitting and next(fds) == nil); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
784 return quitting; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
785 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
786 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
787 return { |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
788 get_backend = function () return "epoll"; end; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
789 addserver = addserver; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
790 addclient = addclient; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
791 add_task = addtimer; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
792 at = at; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
793 loop = loop; |
|
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
794 closeall = closeall; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
795 setquitting = setquitting; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
796 wrapclient = wrapclient; |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
797 watchfd = watchfd; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
798 link = link; |
|
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
799 set_config = function (newconfig) |
|
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
800 cfg = setmetatable(newconfig, default_config); |
|
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
801 end; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
802 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
803 -- libevent emulation |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
804 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
|
805 addevent = function (fd, mode, callback) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
806 local function onevent(self) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
807 local ret = self:callback(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
808 if ret == -1 then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
809 self:set(false, false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
810 elseif ret then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
811 self:set(mode == "r" or mode == "rw", mode == "w" or mode == "rw"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
812 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
813 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
814 |
|
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
815 local conn = setmetatable({ |
|
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
816 getfd = function () return fd; end; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
817 callback = callback; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
818 onreadable = onevent; |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
819 onwritable = onevent; |
|
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
820 close = function (self) |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
821 self:del(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
822 fds[fd] = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
823 end; |
|
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
824 }, interface_mt); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
825 local ok, err = conn:add(mode == "r" or mode == "rw", mode == "w" or mode == "rw"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
826 if not ok then return ok, err; end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
827 return conn; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
828 end; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
829 }; |