Annotate

net/server_epoll.lua @ 9508:2055b497b515

net.server_epoll: Special handling of signal interrupts
author Kim Alvefur <zash@zash.se>
date Fri, 12 Oct 2018 03:22:09 +0200
parent 9507:33d21f020b66
child 9573:57637247356d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- Prosody IM
9474
619ba78709a5 net.server_epoll: Update copyright year
Kim Alvefur <zash@zash.se>
parents: 9473
diff changeset
2 -- Copyright (C) 2016-2018 Kim Alvefur
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 --
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 -- This project is MIT/X11 licensed. Please see the
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 -- COPYING file in the source package for more information.
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 --
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 local t_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 = {
8983
23f66f04e216 net.server: Set default read timeout to 14 minutes (fixes #971)
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
38 read_timeout = 14 * 60;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 write_timeout = 7;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 tcp_backlog = 128;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 accept_retry_interval = 10;
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
42 read_retry_delay = 1e-06;
9311
9b0604fe01f1 net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents: 9310
diff changeset
43 read_size = 8192;
7599
afbda0bd9cfc net.server_epoll: Add separate timout for initial connection
Kim Alvefur <zash@zash.se>
parents: 7598
diff changeset
44 connect_timeout = 20;
7598
335b5ce06062 net.server_epoll: TLS handshake timeout
Kim Alvefur <zash@zash.se>
parents: 7597
diff changeset
45 handshake_timeout = 60;
7623
a1c040a5754f net.server_epoll: Make maximum wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7606
diff changeset
46 max_wait = 86400;
7658
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7657
diff changeset
47 min_wait = 1e-06;
7657
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
48 }};
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
49 local cfg = default_config.__index;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 local fds = createtable(10, 0); -- FD -> conn
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
52
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
53 -- Timer and scheduling --
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
54
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 local timers = {};
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 local function noop() end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 local function closetimer(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 t[1] = 0;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 t[2] = noop;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
63 -- Set to true when timers have changed
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 local resort_timers = false;
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
65
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
66 -- Add absolute timer
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 local function at(time, f)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 local timer = { time, f, close = closetimer };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 t_insert(timers, timer);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 resort_timers = true;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 return timer;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 end
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
73
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
74 -- Add relative timer
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 local function addtimer(timeout, f)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 return at(gettime() + timeout, f);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
79 -- Run callbacks of expired timers
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
80 -- 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
81 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
82 -- 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
83 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
84 return next_delay;
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7628
diff changeset
85 end
0fcde9869cc1 net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents: 7628
diff changeset
86
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 if resort_timers then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 -- Sort earliest timers to the end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 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
90 resort_timers = false;
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
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 -- Iterate from the end and remove completed timers
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 for i = #timers, 1, -1 do
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
95 local timer = timers[i];
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 local t, f = timer[1], timer[2];
7624
23fb3a084956 net.server_epoll: Comments
Kim Alvefur <zash@zash.se>
parents: 7623
diff changeset
97 -- Get time for every iteration to increase accuracy
23fb3a084956 net.server_epoll: Comments
Kim Alvefur <zash@zash.se>
parents: 7623
diff changeset
98 local now = gettime();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 if t > now then
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
100 -- This timer should not fire yet
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 local diff = t - now;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 if diff < next_delay then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 next_delay = diff;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 end
7558
3a2fe8e10eeb net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents: 7557
diff changeset
105 break;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 local new_timeout = f(now);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 if new_timeout then
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
109 -- Schedule for 'delay' from the time actually scheduled,
7624
23fb3a084956 net.server_epoll: Comments
Kim Alvefur <zash@zash.se>
parents: 7623
diff changeset
110 -- not from now, in order to prevent timer drift.
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 timer[1] = t + new_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 resort_timers = true;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 t_remove(timers, i);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
115 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 end
7658
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7657
diff changeset
117
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7657
diff changeset
118 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
119 -- 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
120 -- 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
121 -- 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
122 -- 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
123 -- 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
124 next_delay = min_wait;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 end
7658
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7657
diff changeset
126
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 return next_delay;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
129
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
130 -- Socket handler interface
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
131
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 local interface = {};
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
133 local interface_mt = { __index = interface };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
134
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
135 function interface_mt:__tostring()
7585
b64218c816de net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents: 7584
diff changeset
136 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
137 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
138 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
139 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
140 end
9321
146dc1e4c7ff net.server_epoll: Simplify minimal string representation
Kim Alvefur <zash@zash.se>
parents: 9320
diff changeset
141 return ("FD %d"):format(self:getfd());
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
142 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
143
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
144 -- 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
145 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
146 self:on("detach");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
147 self.listeners = listeners;
9387
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
148 self:on("attach", data);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
149 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
150
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
151 -- 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
152 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
153 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
154 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
155 return;
be374a5778f3 net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents: 7910
diff changeset
156 end
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
157 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
158 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
159 -- 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
160 return;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
161 end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
162 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
163 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
164 log("error", "Error calling on%s: %s", what, err);
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
165 end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
166 return err;
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
167 end
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
168
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
169 -- Return the file descriptor number
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
170 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
171 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
172 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
173 end
7737
f93b3083b46b net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents: 7707
diff changeset
174 return _SOCKETINVALID;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
175 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
176
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
177 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
178 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
179 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
180
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
181 -- Get IP address
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
182 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
183 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
184 end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
185
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
186 -- 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
187 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
188 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
189 end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
190
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
191 -- 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
192 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
193 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
194 end
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
195
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
196 -- 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
197 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
198 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
199 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
200 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
201 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
202 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
203 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
204
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
205 -- Return underlying socket
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
206 function interface:socket()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
207 return self.conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
208 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
209
7910
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7817
diff changeset
210 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
211 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
212 end
91db637be237 net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents: 7817
diff changeset
213
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
214 function interface:setoption(k, v)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
215 -- LuaSec doesn't expose setoption :(
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
216 if self.conn.setoption then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
217 self.conn:setoption(k, v);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
218 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
219 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
220
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
221 -- Timeout for detecting dead or idle sockets
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
222 function interface:setreadtimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
223 if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
224 if self._readtimeout then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
225 self._readtimeout:close();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
226 self._readtimeout = nil;
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 return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
229 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
230 t = t or cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
231 if self._readtimeout then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
232 self._readtimeout[1] = gettime() + t;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
233 resort_timers = true;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
234 else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
235 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
236 if self:on("readtimeout") then
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
237 return cfg.read_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
238 else
7583
0498daffa6f0 net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents: 7574
diff changeset
239 self:on("disconnect", "read timeout");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
240 self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
241 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
242 end);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
243 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
244 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
245
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
246 -- Timeout for detecting dead sockets
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
247 function interface:setwritetimeout(t)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
248 if t == false then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
249 if self._writetimeout then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
250 self._writetimeout:close();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
251 self._writetimeout = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
252 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
253 return
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
254 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
255 t = t or cfg.write_timeout;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
256 if self._writetimeout then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
257 self._writetimeout[1] = gettime() + t;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
258 resort_timers = true;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
259 else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
260 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
261 self:on("disconnect", "write timeout");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
262 self:destroy();
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 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
265 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
266
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
267 function interface:add(r, w)
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
268 local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
269 if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
270 return nil, "invalid fd";
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
271 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
272 if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
273 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
274 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
275 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
276 if errno == EEXIST then
ae6636052be9 net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
277 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
278 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
279 end
9441
116a9d0a295c net.server_epoll: Pass error number to logging
Kim Alvefur <zash@zash.se>
parents: 9439
diff changeset
280 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
281 return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
282 end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
283 self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
284 fds[fd] = self;
9381
80be543a3785 net.server_epoll: Watching instead of registering, seems more understandable
Kim Alvefur <zash@zash.se>
parents: 9321
diff changeset
285 log("debug", "Watching %s", self);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
286 return true;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
287 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
288
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
289 function interface:set(r, w)
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
290 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
291 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
292 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
293 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
294 if r == nil then r = self._wantread; end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
295 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
296 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
297 if not ok then
9384
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9383
diff changeset
298 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
299 return ok, err;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
300 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
301 self._wantread, self._wantwrite = r, w;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
302 return true;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
303 end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
304
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
305 function interface:del()
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
306 local fd = self:getfd();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
307 if fd < 0 then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
308 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
309 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
310 if fds[fd] ~= self then
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
311 return nil, "unregistered fd";
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
312 end
9384
5c8006ce8cb8 net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents: 9383
diff changeset
313 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
314 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
315 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
316 return ok, err;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
317 end
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
318 self._wantread, self._wantwrite = nil, nil;
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
319 fds[fd] = nil;
9381
80be543a3785 net.server_epoll: Watching instead of registering, seems more understandable
Kim Alvefur <zash@zash.se>
parents: 9321
diff changeset
320 log("debug", "Unwatched %s", self);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
321 return true;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
322 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
323
9320
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
324 function interface:setflags(r, w)
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
325 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
326 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
327 return true; -- no change
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
328 end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
329 return self:add(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
330 end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
331 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
332 return self:del();
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
333 end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
334 return self:set(r, w);
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
335 end
8cc498cb0df7 net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents: 9319
diff changeset
336
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
337 -- Called when socket is readable
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
338 function interface:onreadable()
9311
9b0604fe01f1 net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents: 9310
diff changeset
339 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
340 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
341 self:onconnect();
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
342 self:on("incoming", data);
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
343 else
8540
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8507
diff changeset
344 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
345 self:onconnect();
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
346 self:on("incoming", partial, err);
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
347 end
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
348 if err == "wantread" then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
349 self:set(true, nil);
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
350 elseif err == "wantwrite" then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
351 self:set(nil, true);
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
352 elseif err ~= "timeout" then
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
353 self:on("disconnect", err);
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
354 self:destroy()
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
355 return;
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
356 end
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
357 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
358 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
359 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
360 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
361 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
362 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
363 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
364 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
365 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
366
7573
0f0a6febbc5a net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents: 7564
diff changeset
367 -- Called when socket is writable
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
368 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
369 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
370 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
371 local buffer = self.writebuffer;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
372 local data = t_concat(buffer);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
373 local ok, err, partial = self.conn:send(data);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
374 if ok then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
375 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
376 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
377 buffer[i] = nil;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
378 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
379 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
380 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
381 return;
8540
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8507
diff changeset
382 elseif partial then
7591
138f16eb39fb net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents: 7590
diff changeset
383 buffer[1] = data:sub(partial+1);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
384 for i = #buffer, 2, -1 do
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
385 buffer[i] = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
386 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
387 self:setwritetimeout();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
388 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
389 if err == "wantwrite" or err == "timeout" then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
390 self:set(nil, true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
391 elseif err == "wantread" then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
392 self:set(true, nil);
7687
ae24deae6488 net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents: 7658
diff changeset
393 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
394 self:on("disconnect", err);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
395 self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
396 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
397 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
398
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
399 -- The write buffer has been successfully emptied
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
400 function interface:ondrain()
8008
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8007
diff changeset
401 return self:on("drain");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
402 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
403
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
404 -- 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
405 function interface:write(data)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
406 local buffer = self.writebuffer;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
407 if buffer then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
408 t_insert(buffer, data);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
409 else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
410 self.writebuffer = { data };
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
411 end
7550
8c2bc1b6d84a net.server_epoll: Remove last traces of code for bypassing buffering on writable sockets
Kim Alvefur <zash@zash.se>
parents: 7547
diff changeset
412 self:setwritetimeout();
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
413 self:set(nil, true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
414 return #data;
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 interface.send = interface.write;
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 -- Close, possibly after writing is done
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
419 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
420 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
421 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
422 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
423 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
424 self.ondrain = interface.close;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
425 else
9301
2f9687c09e6e net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents: 9300
diff changeset
426 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
427 self.write, self.send = noop, noop;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
428 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
429 self:on("disconnect");
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
430 self:destroy();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
431 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
432 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
433
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
434 function interface:destroy()
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
435 self:del();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
436 self:setwritetimeout(false);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
437 self:setreadtimeout(false);
7594
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
438 self.onreadable = noop;
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
439 self.onwritable = noop;
7594
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
440 self.destroy = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
441 self.close = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
442 self.on = noop;
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
443 self.conn:close();
5e884501a9ac net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents: 7593
diff changeset
444 self.conn = nil;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
445 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
446
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
447 function interface:ssl()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
448 return self._tls;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
449 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
450
9300
1df8832bd29e net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
451 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
452 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
453 self.starttls = false;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
454 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
455 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
456 self.ondrain = interface.starttls;
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
457 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
458 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
459 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
460 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
461 end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
462 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
463 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
464 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
465 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
466 end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
467 end
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
468
412ff404bf58 net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
469 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
470 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
471 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
472 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
473 self._tls = true;
9301
2f9687c09e6e net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents: 9300
diff changeset
474 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
475 self:del();
9431
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9430
diff changeset
476 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
477 if not ok then
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9430
diff changeset
478 log("error", "Failed to initialize TLS: %s", conn);
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9430
diff changeset
479 conn, err = ok, conn;
c3c0523a37c6 net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents: 9430
diff changeset
480 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
481 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
482 self:on("disconnect", err);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
483 self:destroy();
7595
166b2e0766a4 net.server_epoll: Return status from starttls method
Kim Alvefur <zash@zash.se>
parents: 7594
diff changeset
484 return conn, err;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
485 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
486 conn:settimeout(0);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
487 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
488 self:on("starttls");
8008
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8007
diff changeset
489 self.ondrain = nil;
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
490 self.onwritable = interface.tlshandskake;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
491 self.onreadable = interface.tlshandskake;
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
492 return self:init();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
493 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
494 local ok, err = self.conn:dohandshake();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
495 if ok then
9301
2f9687c09e6e net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents: 9300
diff changeset
496 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
497 self.onwritable = nil;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
498 self.onreadable = nil;
8008
62ed3795be13 net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents: 8007
diff changeset
499 self:on("status", "ssl-handshake-complete");
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
500 self:setwritetimeout();
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
501 self:set(true, true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
502 elseif err == "wantread" then
9301
2f9687c09e6e net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents: 9300
diff changeset
503 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
504 self:set(true, false);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
505 self:setreadtimeout(cfg.handshake_timeout);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
506 elseif err == "wantwrite" then
9301
2f9687c09e6e net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents: 9300
diff changeset
507 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
508 self:set(false, true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
509 self:setwritetimeout(cfg.handshake_timeout);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
510 else
9301
2f9687c09e6e net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents: 9300
diff changeset
511 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
512 self:on("disconnect", err);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
513 self:destroy();
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 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
516
9310
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
517 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
518 client:settimeout(0);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
519 local conn = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
520 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
521 _server = server;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
522 created = gettime();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
523 listeners = listeners;
9310
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
524 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
525 writebuffer = {};
9432
2e3f66475cc8 net.server_epoll: Inherit Direct TLS flag from servers to their clients
Kim Alvefur <zash@zash.se>
parents: 9431
diff changeset
526 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
527 tls_direct = server and server.tls_direct;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
528 }, interface_mt);
7591
138f16eb39fb net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents: 7590
diff changeset
529
9383
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
530 conn:updatenames();
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
531 return conn;
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
532 end
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
533
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
534 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
535 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
536 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
537 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
538 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
539 end
9383
3260902a5b22 net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents: 9382
diff changeset
540 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
541 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
542 self.sockname, self.sockport = sockname, sockport;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
543 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
544 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
545
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
546 -- A server interface has new incoming connections waiting
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
547 -- This replaces the onreadable callback
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
548 function interface:onacceptable()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
549 local conn, err = self.conn:accept();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
550 if not conn then
7574
97b8506118a9 net.server_epoll: Fix missing quotes in logging call
Kim Alvefur <zash@zash.se>
parents: 7573
diff changeset
551 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
552 self:pausefor(cfg.accept_retry_interval);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
553 return;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
554 end
9309
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
555 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
556 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
557 client:init();
9309
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
558 if self.tls_direct then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
559 client:starttls(self.tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
560 end
7597
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
561 end
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
562
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
563 -- Initialization
7597
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
564 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
565 self:setwritetimeout();
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
566 return self:add(true, true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
567 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
568
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
569 function interface:pause()
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
570 return self:set(false);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
571 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
572
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
573 function interface:resume()
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
574 return self:set(true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
575 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
576
7624
23fb3a084956 net.server_epoll: Comments
Kim Alvefur <zash@zash.se>
parents: 7623
diff changeset
577 -- Pause connection for some time
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
578 function interface:pausefor(t)
7559
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
579 if self._pausefor then
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
580 self._pausefor:close();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
581 end
7559
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
582 if t == false then return; end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
583 self:set(false);
7559
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
584 self._pausefor = addtimer(t, function ()
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
585 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
586 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
587 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
588 end
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
589 self:set(true);
7559
b1b27dedf4cf net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents: 7558
diff changeset
590 end);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
591 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
592
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
593 -- Connected!
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
594 function interface:onconnect()
8778
0364454bdd77 net.server_epoll: Guard against connection missing the getpeername method (thanks LuaSec)
Kim Alvefur <zash@zash.se>
parents: 8777
diff changeset
595 if self.conn and not self.peername and self.conn.getpeername then
8777
2bfe963f3041 net.server_epoll: Retry retrieving peername once connected
Kim Alvefur <zash@zash.se>
parents: 8776
diff changeset
596 self.peername, self.peerport = self.conn:getpeername();
2bfe963f3041 net.server_epoll: Retry retrieving peername once connected
Kim Alvefur <zash@zash.se>
parents: 8776
diff changeset
597 end
8540
ba9fd886b34d net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents: 8507
diff changeset
598 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
599 self:on("connect");
8506
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8271
diff changeset
600 end
174fd716c9fa server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents: 8271
diff changeset
601
9310
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
602 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
603 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
604 if not conn then return conn, err; end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
605 conn:settimeout(0);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
606 local server = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
607 conn = conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
608 created = gettime();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
609 listeners = listeners;
9310
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
610 read_size = read_size;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
611 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
612 tls_ctx = tls_ctx;
9309
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
613 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
614 sockname = addr;
98ee3ed105cf net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents: 7583
diff changeset
615 sockport = port;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
616 }, interface_mt);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
617 server:add(true, false);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
618 return server;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
619 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
620
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
621 -- COMPAT
9310
2d2d4c293efa net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents: 9309
diff changeset
622 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
623 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
624 if not client.peername then
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
625 client.peername, client.peerport = addr, port;
cd34aa6b1632 net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents: 7596
diff changeset
626 end
9473
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9445
diff changeset
627 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
628 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
629 if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
630 client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
631 end
7551
838212918f11 net.server_epoll: Rename arguments and varibles for consistensy
Kim Alvefur <zash@zash.se>
parents: 7550
diff changeset
632 return client;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
633 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
634
7800
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7799
diff changeset
635 -- 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
636 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
637 local create;
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
638 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
639 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
640 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
641 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
642 typ = "tcp6";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
643 else
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
644 typ = "tcp4";
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
645 end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
646 end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
647 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
648 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
649 end
183ff7a8051b net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents: 9477
diff changeset
650 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
651 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
652 end
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9445
diff changeset
653 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
654 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
655 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
656 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
657 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
658 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
659 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
660 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
661 if tls_ctx then
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
662 client:starttls(tls_ctx);
33d500c25d76 net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents: 9306
diff changeset
663 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
664 return client, conn;
7553
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7552
diff changeset
665 end
4f3e4a092348 net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents: 7552
diff changeset
666
9319
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
667 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
668 local conn = setmetatable({
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
669 conn = fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
670 onreadable = onreadable;
9319
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
671 onwritable = onwritable;
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
672 close = function (self)
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
673 self:del();
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
674 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
675 }, interface_mt);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
676 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
677 conn.getfd = function ()
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
678 return fd;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
679 end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
680 -- 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
681 end
9319
7c954c75b6ac net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents: 9314
diff changeset
682 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
683 return conn;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
684 end;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
685
7800
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7799
diff changeset
686 -- 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
687 local function link(from, to)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
688 from.listeners = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
689 onincoming = function (_, data)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
690 from:pause();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
691 to:write(data);
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
692 end,
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
693 }, {__index=from.listeners});
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
694 to.listeners = setmetatable({
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
695 ondrain = function ()
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
696 from:resume();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
697 end,
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
698 }, {__index=to.listeners});
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
699 from:set(true, nil);
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
700 to:set(nil, true);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
701 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
702
9438
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9432
diff changeset
703 -- COMPAT
916bee81eb7e net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents: 9432
diff changeset
704 -- 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
705 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
706 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
707
7800
dadf9ba290c5 server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents: 7799
diff changeset
708 -- 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
709 local function closeall()
7799
93643a61858a server_epoll: Ignore unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7797
diff changeset
710 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
711 conn:close();
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
712 end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
713 end
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
714
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
715 local quitting = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
716
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
717 -- 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
718 local function setquitting(quit)
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
719 if quit then
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
720 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
721 closeall();
7796
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
722 else
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
723 quitting = nil;
12609aee3b3b server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents: 7795
diff changeset
724 end
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
725 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
726
7637
cccea9136b2d net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents: 7630
diff changeset
727 -- 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
728 local function loop(once)
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
729 repeat
7658
e14a124c4d73 net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents: 7657
diff changeset
730 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
731 local fd, r, w = poll:wait(t);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
732 if fd then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
733 local conn = fds[fd];
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
734 if conn then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
735 if r then
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
736 conn:onreadable();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
737 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
738 if w then
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
739 conn:onwritable();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
740 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
741 else
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
742 log("debug", "Removing unknown fd %d", fd);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
743 poll:del(fd);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
744 end
9508
2055b497b515 net.server_epoll: Special handling of signal interrupts
Kim Alvefur <zash@zash.se>
parents: 9507
diff changeset
745 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
746 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
747 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
748 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
749 return quitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
750 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
751
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
752 return {
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
753 get_backend = function () return "epoll"; end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
754 addserver = addserver;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
755 addclient = addclient;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
756 add_task = addtimer;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
757 at = at;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
758 loop = loop;
7794
424bbbeb9257 server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents: 7737
diff changeset
759 closeall = closeall;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
760 setquitting = setquitting;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
761 wrapclient = wrapclient;
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8778
diff changeset
762 watchfd = watchfd;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
763 link = link;
7657
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
764 set_config = function (newconfig)
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
765 cfg = setmetatable(newconfig, default_config);
252823632401 net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents: 7637
diff changeset
766 end;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
767
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
768 -- libevent emulation
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
769 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
770 addevent = function (fd, mode, callback)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
771 local function onevent(self)
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
772 local ret = self:callback();
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
773 if ret == -1 then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
774 self:set(false, false);
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
775 elseif ret then
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
776 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
777 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
778 end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
779
7817
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7811
diff changeset
780 local conn = setmetatable({
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7811
diff changeset
781 getfd = function () return fd; end;
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
782 callback = callback;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
783 onreadable = onevent;
8542
8c39ec8e6018 net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents: 8541
diff changeset
784 onwritable = onevent;
7817
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7811
diff changeset
785 close = function (self)
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
786 self:del();
7547
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
787 fds[fd] = nil;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
788 end;
7817
4e3654031693 net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents: 7811
diff changeset
789 }, interface_mt);
9314
c9eef7e8ee65 net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents: 9311
diff changeset
790 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
791 if not ok then return ok, err; end
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
792 return conn;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
793 end;
b327322ce2dd net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff changeset
794 };