Software /
code /
prosody
Annotate
net/server_epoll.lua @ 10996:d742095046f9
net.cqueues: Switch to server.watchfd for main loop integration
Why? Just look at all that code deleted!
watchfd is the prefered way to poll things that expose FDs for this
purpose, altho it was added after net.cqueues.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 08 Jul 2020 20:11:49 +0200 |
parent | 10992:df3ee12acd8c |
child | 11014:05fefde93036 |
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_insert = table.insert; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 local t_concat = table.concat; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 local setmetatable = setmetatable; |
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
12 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
|
13 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
|
14 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
|
15 local pairs = pairs; |
10586
f86ed818a7f8
net.server_epoll: Collect full traceback from errors in listeners
Kim Alvefur <zash@zash.se>
parents:
10571
diff
changeset
|
16 local traceback = debug.traceback; |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
17 local logger = require "util.logger"; |
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
18 local log = logger.init("server_epoll"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 local socket = require "socket"; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 local luasec = require "ssl"; |
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
21 local realtime = require "util.time".now; |
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
22 local monotonic = require "util.time".monotonic; |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
23 local indexedbheap = require "util.indexedbheap"; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 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
|
25 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
|
26 local inet_pton = inet.pton; |
7737
f93b3083b46b
net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents:
7707
diff
changeset
|
27 local _SOCKETINVALID = socket._SOCKETINVALID or -1; |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
28 local new_id = require "util.id".medium; |
10586
f86ed818a7f8
net.server_epoll: Collect full traceback from errors in listeners
Kim Alvefur <zash@zash.se>
parents:
10571
diff
changeset
|
29 local xpcall = require "util.xpcall".xpcall; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 |
9506
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
31 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
|
32 local EEXIST = poller.EEXIST; |
9507
33d21f020b66
net.server_epoll: Ignore ENOENT when deregitering socket
Kim Alvefur <zash@zash.se>
parents:
9506
diff
changeset
|
33 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
|
34 |
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
35 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
|
36 |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 local _ENV = nil; |
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8552
diff
changeset
|
38 -- luacheck: std none |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 |
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
40 local default_config = { __index = { |
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
41 -- If a connection is silent for this long, close it unless onreadtimeout says not to |
8983
23f66f04e216
net.server: Set default read timeout to 14 minutes (fixes #971)
Kim Alvefur <zash@zash.se>
parents:
8781
diff
changeset
|
42 read_timeout = 14 * 60; |
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
43 |
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
44 -- How long to wait for a socket to become writable after queuing data to send |
9825
5ccce16c6449
net.server_epoll: Increase send_timeout to 3 minutes (to match server_event)
Kim Alvefur <zash@zash.se>
parents:
9824
diff
changeset
|
45 send_timeout = 180; |
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
46 |
9824
729de68f0068
net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents:
9823
diff
changeset
|
47 -- How long to wait for a socket to become writable after creation |
729de68f0068
net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents:
9823
diff
changeset
|
48 connect_timeout = 20; |
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
49 |
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
50 -- Some number possibly influencing how many pending connections can be accepted |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 tcp_backlog = 128; |
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
52 |
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
53 -- If accepting a new incoming connection fails, wait this long before trying again |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 accept_retry_interval = 10; |
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
55 |
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
56 -- If there is still more data to read from LuaSocktes buffer, wait this long and read again |
7560
785fa1138293
net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents:
7559
diff
changeset
|
57 read_retry_delay = 1e-06; |
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
58 |
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
59 -- Size of chunks to read from sockets |
9311
9b0604fe01f1
net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents:
9310
diff
changeset
|
60 read_size = 8192; |
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
61 |
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
62 -- Timeout used during between steps in TLS handshakes |
9822
13c2707d2417
net.server_epoll: Rename handshake_timeout to ssl_handshake_timeout (fixes #1319)
Kim Alvefur <zash@zash.se>
parents:
9821
diff
changeset
|
63 ssl_handshake_timeout = 60; |
9665
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
64 |
4790d1b88919
server_epoll: Add comments describing config options
Kim Alvefur <zash@zash.se>
parents:
9664
diff
changeset
|
65 -- Maximum and minimum amount of time to sleep waiting for events (adjusted for pending timers) |
7623
a1c040a5754f
net.server_epoll: Make maximum wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7606
diff
changeset
|
66 max_wait = 86400; |
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
67 min_wait = 1e-06; |
10081
72adf1f39404
net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents:
10080
diff
changeset
|
68 |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
69 -- Enable extra noisy debug logging |
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
70 -- TODO disable once considered stable |
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
71 verbose = true; |
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
72 |
10081
72adf1f39404
net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents:
10080
diff
changeset
|
73 -- EXPERIMENTAL |
72adf1f39404
net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents:
10080
diff
changeset
|
74 -- Whether to kill connections in case of callback errors. |
72adf1f39404
net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents:
10080
diff
changeset
|
75 fatal_errors = false; |
10228
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
76 |
10992
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
77 -- Or disable protection (like server_select) for potential performance gains |
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
78 protect_listeners = true; |
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
79 |
10228
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
80 -- Attempt writes instantly |
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
81 opportunistic_writes = false; |
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
82 }}; |
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
83 local cfg = default_config.__index; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 local fds = createtable(10, 0); -- FD -> conn |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
86 |
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
87 -- Timer and scheduling -- |
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
88 |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
89 local timers = indexedbheap.create(); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 local function noop() end |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
92 local function closetimer(id) |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
93 timers:remove(id); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
96 local function reschedule(id, time) |
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
97 time = monotonic() + time; |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
98 timers:reprioritize(id, time); |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
99 end |
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
100 |
10490
c9cff02c0528
net.server_epoll: Remove unused function for adding timer at absolute time
Kim Alvefur <zash@zash.se>
parents:
10486
diff
changeset
|
101 -- Add relative timer |
10982
276f16101d59
net.server_epoll: Make API-compatible with util.timer
Kim Alvefur <zash@zash.se>
parents:
10861
diff
changeset
|
102 local function addtimer(timeout, f, param) |
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
103 local time = monotonic() + timeout; |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
104 if param ~= nil then |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
105 local timer_callback = f |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
106 function f(current_time, timer_id) |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
107 local t = timer_callback(current_time, timer_id, param) |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
108 return t; |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
109 end |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
110 end |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
111 local id = timers:insert(f, time); |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
112 return id; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 end |
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
114 |
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
115 -- Run callbacks of expired timers |
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
116 -- 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
|
117 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
|
118 -- Any timers at all? |
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
119 local elapsed = monotonic(); |
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
120 local now = realtime(); |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
121 local peek = timers:peek(); |
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
122 while peek do |
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
123 |
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
124 if peek > elapsed then |
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
125 next_delay = peek - elapsed; |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
126 break; |
10681
e531273341d3
net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents:
10059
diff
changeset
|
127 end |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
128 |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
129 local _, timer, id = timers:pop(); |
10990
03e76ad725b2
net.server_epoll: ... and include a traceback
Kim Alvefur <zash@zash.se>
parents:
10989
diff
changeset
|
130 local ok, ret = xpcall(timer, traceback, now, id); |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
131 if ok and type(ret) == "number" then |
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
132 local next_time = elapsed+ret; |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
133 timers:insert(timer, next_time); |
10989
b824fe9d0c8b
net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents:
10987
diff
changeset
|
134 elseif not ok then |
b824fe9d0c8b
net.server_epoll: Report errors in timers
Kim Alvefur <zash@zash.se>
parents:
10987
diff
changeset
|
135 log("error", "Error in timer: %s", ret); |
10681
e531273341d3
net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents:
10059
diff
changeset
|
136 end |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
137 |
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
138 peek = timers:peek(); |
10681
e531273341d3
net.server_epoll: Fix indentation
Kim Alvefur <zash@zash.se>
parents:
10059
diff
changeset
|
139 end |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
140 if peek == nil then |
7629
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
141 return next_delay; |
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
142 end |
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
143 |
10059
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
144 if next_delay < min_wait then |
c8c3f2eba898
net.server_epoll: Backport timer optimization 6c2370f17027 from trunk (see #1388)
Kim Alvefur <zash@zash.se>
parents:
9994
diff
changeset
|
145 return min_wait; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
146 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 return next_delay; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
148 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
149 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
150 -- Socket handler interface |
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
151 |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 local interface = {}; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
153 local interface_mt = { __index = interface }; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
154 |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
155 function interface_mt:__tostring() |
7585
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
156 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
|
157 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
|
158 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
|
159 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
|
160 end |
9321
146dc1e4c7ff
net.server_epoll: Simplify minimal string representation
Kim Alvefur <zash@zash.se>
parents:
9320
diff
changeset
|
161 return ("FD %d"):format(self:getfd()); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
162 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
164 interface.log = log; |
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
165 function interface:debug(msg, ...) --luacheck: ignore 212/self |
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
166 self.log("debug", msg, ...); |
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
167 end |
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
168 |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
169 interface.noise = interface.debug; |
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
170 function interface:noise(msg, ...) --luacheck: ignore 212/self |
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
171 if cfg.verbose then |
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
172 return self:debug(msg, ...); |
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
173 end |
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
174 end |
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
175 |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
176 function interface:error(msg, ...) --luacheck: ignore 212/self |
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
177 self.log("error", msg, ...); |
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
178 end |
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
179 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
180 -- 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
|
181 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
|
182 self:on("detach"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
183 self.listeners = listeners; |
9387
33e52f727f0f
net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents:
9385
diff
changeset
|
184 self:on("attach", data); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
185 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
186 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
187 -- 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
|
188 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
|
189 if not self.listeners then |
10589
3540118699cf
net.server_epoll: Log error about missing *all* callbacks at 'error' level
Kim Alvefur <zash@zash.se>
parents:
10588
diff
changeset
|
190 self:error("Interface is missing listener callbacks"); |
8006
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
191 return; |
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
192 end |
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
193 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
|
194 if not listener then |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
195 self:noise("Missing listener 'on%s'", what); -- uncomment for development and debugging |
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
196 return; |
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
197 end |
10992
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
198 if not cfg.protect_listeners then |
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
199 return listener(self, ...); |
df3ee12acd8c
net.server_epoll: Add setting for turning off callback protections
Kim Alvefur <zash@zash.se>
parents:
10991
diff
changeset
|
200 end |
10991
aa85cb5b859f
net.server_epoll: Allow setting a custom error handler for listener
Kim Alvefur <zash@zash.se>
parents:
10990
diff
changeset
|
201 local onerror = self.listeners.onerror or traceback; |
aa85cb5b859f
net.server_epoll: Allow setting a custom error handler for listener
Kim Alvefur <zash@zash.se>
parents:
10990
diff
changeset
|
202 local ok, err = xpcall(listener, onerror, self, ...); |
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
203 if not ok then |
10081
72adf1f39404
net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents:
10080
diff
changeset
|
204 if cfg.fatal_errors then |
10588
ceadf3d3fecf
net.server_epoll: Log errors caught in listeners on 'error' level
Kim Alvefur <zash@zash.se>
parents:
10587
diff
changeset
|
205 self:error("Closing due to error calling on%s: %s", what, err); |
10081
72adf1f39404
net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents:
10080
diff
changeset
|
206 self:destroy(); |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
207 else |
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
208 self:debug("Error calling on%s: %s", what, err); |
10081
72adf1f39404
net.server_epoll: Add experimental option to close connections in case of listener error
Kim Alvefur <zash@zash.se>
parents:
10080
diff
changeset
|
209 end |
10080
39ca4202ae1e
net.server_epoll: Return listener error message
Kim Alvefur <zash@zash.se>
parents:
10061
diff
changeset
|
210 return nil, err; |
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
211 end |
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
212 return err; |
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
213 end |
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
214 |
10278
94c584d67533
net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents:
10234
diff
changeset
|
215 -- Allow this one to be overridden |
94c584d67533
net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents:
10234
diff
changeset
|
216 function interface:onincoming(...) |
94c584d67533
net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents:
10234
diff
changeset
|
217 return self:on("incoming", ...); |
94c584d67533
net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents:
10234
diff
changeset
|
218 end |
94c584d67533
net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents:
10234
diff
changeset
|
219 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
220 -- Return the file descriptor number |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 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
|
222 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
|
223 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
|
224 end |
7737
f93b3083b46b
net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents:
7707
diff
changeset
|
225 return _SOCKETINVALID; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
226 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
227 |
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
|
228 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
|
229 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
|
230 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
|
231 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
232 -- Get IP address |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
233 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
|
234 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
|
235 end |
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
236 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
237 -- 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
|
238 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
|
239 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
|
240 end |
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
241 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
242 -- 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
|
243 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
|
244 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
|
245 end |
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
246 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
247 -- 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
|
248 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
|
249 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
|
250 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
|
251 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
|
252 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
|
253 end |
7547
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 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
256 -- Return underlying socket |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
257 function interface:socket() |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
258 return self.conn; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
259 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
260 |
7910
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
261 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
|
262 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
|
263 end |
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
264 |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
265 function interface:setoption(k, v) |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
266 -- LuaSec doesn't expose setoption :( |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
267 if self.conn.setoption then |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
268 self.conn:setoption(k, v); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
269 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
270 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
271 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
272 -- Timeout for detecting dead or idle sockets |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
273 function interface:setreadtimeout(t) |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
274 if t == false then |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
275 if self._readtimeout then |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
276 closetimer(self._readtimeout); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
277 self._readtimeout = nil; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
278 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
279 return |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
280 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
281 t = t or cfg.read_timeout; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
282 if self._readtimeout then |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
283 reschedule(self._readtimeout, t); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
284 else |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
285 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
|
286 if self:on("readtimeout") then |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
287 self:noise("Read timeout handled"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
288 return cfg.read_timeout; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
289 else |
10417
d8a0b0d21c81
net.server_epoll: Improve read timeout debug messages
Kim Alvefur <zash@zash.se>
parents:
10416
diff
changeset
|
290 self:debug("Read timeout not handled, disconnecting"); |
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
291 self:on("disconnect", "read timeout"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
292 self:destroy(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
293 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
294 end); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
295 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
296 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
297 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
298 -- Timeout for detecting dead sockets |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
299 function interface:setwritetimeout(t) |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
300 if t == false then |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
301 if self._writetimeout then |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
302 closetimer(self._writetimeout); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
303 self._writetimeout = nil; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
304 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
305 return |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
306 end |
9821
7712488c8e49
net.server_epoll: Use send_timeout for write timout like other implementations (fixes #1316)
Kim Alvefur <zash@zash.se>
parents:
9665
diff
changeset
|
307 t = t or cfg.send_timeout; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
308 if self._writetimeout then |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
309 reschedule(self._writetimeout, t); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
310 else |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
311 self._writetimeout = addtimer(t, function () |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
312 self:noise("Write timeout"); |
10638
92918212ee83
net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents:
10589
diff
changeset
|
313 self:on("disconnect", self._connected and "write timeout" or "connection timeout"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
314 self:destroy(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
315 end); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
316 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
317 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
318 |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
319 function interface:add(r, w) |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
320 local fd = self:getfd(); |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
321 if fd < 0 then |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
322 return nil, "invalid fd"; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
323 end |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
324 if r == nil then r = self._wantread; end |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
325 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
|
326 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
|
327 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
|
328 if errno == EEXIST then |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
329 self:debug("FD already registered in poller! (EEXIST)"); |
9506
ae6636052be9
net.server_epoll: Graceful handling of registering already added socket
Kim Alvefur <zash@zash.se>
parents:
9499
diff
changeset
|
330 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
|
331 end |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
332 self:debug("Could not register in poller: %s(%d)", err, errno); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
333 return ok, err; |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
334 end |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
335 self._wantread, self._wantwrite = r, w; |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
336 fds[fd] = self; |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
337 self:noise("Registered in poller"); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
338 return true; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
339 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
340 |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
341 function interface:set(r, w) |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
342 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
|
343 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
|
344 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
|
345 end |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
346 if r == nil then r = self._wantread; end |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
347 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
|
348 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
|
349 if not ok then |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
350 self:debug("Could not update poller state: %s(%d)", err, errno); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
351 return ok, err; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
352 end |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
353 self._wantread, self._wantwrite = r, w; |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
354 return true; |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
355 end |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
356 |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
357 function interface:del() |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
358 local fd = self:getfd(); |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
359 if fd < 0 then |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
360 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
|
361 end |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
362 if fds[fd] ~= self then |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
363 return nil, "unregistered fd"; |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
364 end |
9384
5c8006ce8cb8
net.server_epoll: Include errno in log messages
Kim Alvefur <zash@zash.se>
parents:
9383
diff
changeset
|
365 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
|
366 if not ok and errno ~= ENOENT then |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
367 self:debug("Could not unregister: %s(%d)", err, errno); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
368 return ok, err; |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
369 end |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
370 self._wantread, self._wantwrite = nil, nil; |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
371 fds[fd] = nil; |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
372 self:noise("Unregistered from poller"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
373 return true; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
374 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
375 |
9320
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
376 function interface:setflags(r, w) |
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
377 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
|
378 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
|
379 return true; -- no change |
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
380 end |
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
381 return self:add(r, w); |
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
382 end |
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
383 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
|
384 return self:del(); |
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
385 end |
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
386 return self:set(r, w); |
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
387 end |
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
388 |
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
389 -- Called when socket is readable |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
390 function interface:onreadable() |
9311
9b0604fe01f1
net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents:
9310
diff
changeset
|
391 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
|
392 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
|
393 self:onconnect(); |
10278
94c584d67533
net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents:
10234
diff
changeset
|
394 self:onincoming(data); |
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
395 else |
9931
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
396 if err == "wantread" then |
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
397 self:set(true, nil); |
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
398 err = "timeout"; |
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
399 elseif err == "wantwrite" then |
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
400 self:set(nil, true); |
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
401 err = "timeout"; |
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
402 end |
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
403 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
|
404 self:onconnect(); |
10278
94c584d67533
net.server_epoll: Make it easy to override handler for incoming data
Kim Alvefur <zash@zash.se>
parents:
10234
diff
changeset
|
405 self:onincoming(partial, err); |
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
406 end |
9931
485231f8b75d
net.server_epoll: Handle LuaSec wantread/wantwrite conditions before callbacks (fixes #1333)
Kim Alvefur <zash@zash.se>
parents:
9822
diff
changeset
|
407 if err ~= "timeout" then |
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
408 self:on("disconnect", err); |
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
409 self:destroy() |
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
410 return; |
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
411 end |
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
412 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
|
413 if not self.conn then return; end |
10098
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
414 if self._limit and (data or partial) then |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
415 local cost = self._limit * #(data or partial); |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
416 if cost > cfg.min_wait then |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
417 self:setreadtimeout(false); |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
418 self:pausefor(cost); |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
419 return; |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
420 end |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
421 end |
9932
df73ca804719
net.server_epoll: Skip delayed continuation read on paused connections
Kim Alvefur <zash@zash.se>
parents:
9931
diff
changeset
|
422 if self._wantread and self.conn:dirty() then |
7606
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
423 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
|
424 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
|
425 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
|
426 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
|
427 end |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
428 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
429 |
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
430 -- Called when socket is writable |
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
431 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
|
432 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
|
433 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
|
434 local buffer = self.writebuffer; |
10571
cfeb0077c9e9
net.server_epoll: Avoid concatenating buffer with single item
Kim Alvefur <zash@zash.se>
parents:
10546
diff
changeset
|
435 local data = #buffer == 1 and buffer[1] or t_concat(buffer); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
436 local ok, err, partial = self.conn:send(data); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
437 if ok then |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
438 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
|
439 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
|
440 buffer[i] = nil; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
441 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
|
442 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
|
443 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
|
444 return; |
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
445 elseif partial then |
10305
2fadbf209678
net.server_epoll: Log size of partial writes (debug)
Kim Alvefur <zash@zash.se>
parents:
10300
diff
changeset
|
446 self:debug("Sent %d out of %d buffered bytes", partial, #data); |
7591
138f16eb39fb
net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents:
7590
diff
changeset
|
447 buffer[1] = data:sub(partial+1); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
448 for i = #buffer, 2, -1 do |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
449 buffer[i] = nil; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
450 end |
10228
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
451 self:set(nil, true); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
452 self:setwritetimeout(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
453 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
454 if err == "wantwrite" or err == "timeout" then |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
455 self:set(nil, true); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
456 elseif err == "wantread" then |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
457 self:set(true, nil); |
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
458 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
|
459 self:on("disconnect", err); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
460 self:destroy(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
461 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
462 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
463 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
464 -- The write buffer has been successfully emptied |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
465 function interface:ondrain() |
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
466 return self:on("drain"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
467 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
468 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
469 -- 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
|
470 function interface:write(data) |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
471 local buffer = self.writebuffer; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
472 if buffer then |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
473 t_insert(buffer, data); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
474 else |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
475 self.writebuffer = { data }; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
476 end |
9581
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
477 if not self._write_lock then |
10228
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
478 if cfg.opportunistic_writes then |
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
479 self:onwritable(); |
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
480 return #data; |
e77bf4222fae
net.server_epoll: Add support for opportunistic writes
Kim Alvefur <zash@zash.se>
parents:
10098
diff
changeset
|
481 end |
9581
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
482 self:setwritetimeout(); |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
483 self:set(nil, true); |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
484 end |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
485 return #data; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
486 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
487 interface.send = interface.write; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
488 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
489 -- Close, possibly after writing is done |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
490 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
|
491 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
|
492 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
|
493 self.write, self.send = noop, noop; -- No more writing |
10416
6af8c812a885
net.server_epoll: Clarify a debug message
Kim Alvefur <zash@zash.se>
parents:
10332
diff
changeset
|
494 self:debug("Close after writing remaining buffered data"); |
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
495 self.ondrain = interface.close; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
496 else |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
497 self:debug("Closing now"); |
7593
0266434d7df1
net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents:
7592
diff
changeset
|
498 self.write, self.send = noop, noop; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
499 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
|
500 self:on("disconnect"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
501 self:destroy(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
502 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
503 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
504 |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
505 function interface:destroy() |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
506 self:del(); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
507 self:setwritetimeout(false); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
508 self:setreadtimeout(false); |
7594
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
509 self.onreadable = noop; |
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
510 self.onwritable = noop; |
7594
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
511 self.destroy = noop; |
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
512 self.close = noop; |
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
513 self.on = noop; |
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
514 self.conn:close(); |
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
515 self.conn = nil; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
516 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
517 |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
518 function interface:ssl() |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
519 return self._tls; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
520 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
521 |
9300
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
522 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
|
523 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
|
524 self.starttls = false; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
525 if self.writebuffer and self.writebuffer[1] then |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
526 self:debug("Start TLS after write"); |
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
527 self.ondrain = interface.starttls; |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
528 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
|
529 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
|
530 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
|
531 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
|
532 end |
10847
42c8dce6e765
net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents:
10846
diff
changeset
|
533 self.onwritable = interface.tlshandshake; |
42c8dce6e765
net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents:
10846
diff
changeset
|
534 self.onreadable = interface.tlshandshake; |
9430
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
535 self:set(true, true); |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
536 self:debug("Prepared to start TLS"); |
9430
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
537 end |
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
538 end |
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
539 |
10847
42c8dce6e765
net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents:
10846
diff
changeset
|
540 function interface:tlshandshake() |
9430
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
541 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
|
542 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
|
543 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
|
544 self._tls = true; |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
545 self:debug("Starting TLS now"); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
546 self:del(); |
10329
c0a72c97e6cf
net.server_epoll: Fix to get remote IP on direct TLS connections
Kim Alvefur <zash@zash.se>
parents:
10328
diff
changeset
|
547 self:updatenames(); -- Can't getpeer/sockname after wrap() |
9431
c3c0523a37c6
net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents:
9430
diff
changeset
|
548 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
|
549 if not ok then |
c3c0523a37c6
net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents:
9430
diff
changeset
|
550 conn, err = ok, conn; |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
551 self:debug("Failed to initialize TLS: %s", err); |
9431
c3c0523a37c6
net.server_epoll: Catch errors from luasec.wrap
Kim Alvefur <zash@zash.se>
parents:
9430
diff
changeset
|
552 end |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
553 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
|
554 self:on("disconnect", err); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
555 self:destroy(); |
7595
166b2e0766a4
net.server_epoll: Return status from starttls method
Kim Alvefur <zash@zash.se>
parents:
7594
diff
changeset
|
556 return conn, err; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
557 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
558 conn:settimeout(0); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
559 self.conn = conn; |
9847
adc0672b700e
net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents:
9835
diff
changeset
|
560 if conn.sni then |
adc0672b700e
net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents:
9835
diff
changeset
|
561 if self.servername then |
adc0672b700e
net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents:
9835
diff
changeset
|
562 conn:sni(self.servername); |
9853
9aea8dbb105d
net.server: Only add alternate SNI contexts if at least one is provided
Kim Alvefur <zash@zash.se>
parents:
9847
diff
changeset
|
563 elseif self._server and type(self._server.hosts) == "table" and next(self._server.hosts) ~= nil then |
9847
adc0672b700e
net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents:
9835
diff
changeset
|
564 conn:sni(self._server.hosts, true); |
adc0672b700e
net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents:
9835
diff
changeset
|
565 end |
adc0672b700e
net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents:
9835
diff
changeset
|
566 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
|
567 self:on("starttls"); |
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
568 self.ondrain = nil; |
10847
42c8dce6e765
net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents:
10846
diff
changeset
|
569 self.onwritable = interface.tlshandshake; |
42c8dce6e765
net.server_epoll: Fix typo in internal method name
Kim Alvefur <zash@zash.se>
parents:
10846
diff
changeset
|
570 self.onreadable = interface.tlshandshake; |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
571 return self:init(); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
572 end |
10846
d0b098d0f6c3
net.server_epoll: Log some noise before TLS handshake step
Kim Alvefur <zash@zash.se>
parents:
10683
diff
changeset
|
573 self:noise("Continuing TLS handshake"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
574 local ok, err = self.conn:dohandshake(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
575 if ok then |
10309
2a31571efce0
net.server_epoll: Guard against nil return from TLS info method
Kim Alvefur <zash@zash.se>
parents:
10307
diff
changeset
|
576 local info = self.conn.info and self.conn:info(); |
2a31571efce0
net.server_epoll: Guard against nil return from TLS info method
Kim Alvefur <zash@zash.se>
parents:
10307
diff
changeset
|
577 if type(info) == "table" then |
10307
6a997f0ceba8
net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents:
10305
diff
changeset
|
578 self:debug("TLS handshake complete (%s with %s)", info.protocol, info.cipher); |
6a997f0ceba8
net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents:
10305
diff
changeset
|
579 else |
6a997f0ceba8
net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents:
10305
diff
changeset
|
580 self:debug("TLS handshake complete"); |
6a997f0ceba8
net.server_epoll: Log TLS version and cipher for all completed handshakes
Kim Alvefur <zash@zash.se>
parents:
10305
diff
changeset
|
581 end |
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
582 self.onwritable = nil; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
583 self.onreadable = nil; |
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
584 self:on("status", "ssl-handshake-complete"); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
585 self:setwritetimeout(); |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
586 self:set(true, true); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
587 elseif err == "wantread" then |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
588 self:noise("TLS handshake to wait until readable"); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
589 self:set(true, false); |
9822
13c2707d2417
net.server_epoll: Rename handshake_timeout to ssl_handshake_timeout (fixes #1319)
Kim Alvefur <zash@zash.se>
parents:
9821
diff
changeset
|
590 self:setreadtimeout(cfg.ssl_handshake_timeout); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
591 elseif err == "wantwrite" then |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
592 self:noise("TLS handshake to wait until writable"); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
593 self:set(false, true); |
9822
13c2707d2417
net.server_epoll: Rename handshake_timeout to ssl_handshake_timeout (fixes #1319)
Kim Alvefur <zash@zash.se>
parents:
9821
diff
changeset
|
594 self:setwritetimeout(cfg.ssl_handshake_timeout); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
595 else |
10649
228277be4a28
net.server_epoll: Reduce log level of TLS handshake errors to debug
Kim Alvefur <zash@zash.se>
parents:
10638
diff
changeset
|
596 self:debug("TLS handshake error: %s", err); |
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
597 self:on("disconnect", err); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
598 self:destroy(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
599 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
600 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
601 |
10233
600eee3c4752
net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents:
10228
diff
changeset
|
602 local function wrapsocket(client, server, read_size, listeners, tls_ctx, extra) -- luasocket object -> interface object |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
603 client:settimeout(0); |
10279
0e1701197722
net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents:
10278
diff
changeset
|
604 local conn_id = ("conn%s"):format(new_id()); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
605 local conn = setmetatable({ |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
606 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
|
607 _server = server; |
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
608 created = realtime(); |
7547
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 or (server and server.read_size); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
611 writebuffer = {}; |
9432
2e3f66475cc8
net.server_epoll: Inherit Direct TLS flag from servers to their clients
Kim Alvefur <zash@zash.se>
parents:
9431
diff
changeset
|
612 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
|
613 tls_direct = server and server.tls_direct; |
10279
0e1701197722
net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents:
10278
diff
changeset
|
614 id = conn_id; |
0e1701197722
net.server_epoll: Make log tag accessible as a field
Kim Alvefur <zash@zash.se>
parents:
10278
diff
changeset
|
615 log = logger.init(conn_id); |
10233
600eee3c4752
net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents:
10228
diff
changeset
|
616 extra = extra; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
617 }, interface_mt); |
7591
138f16eb39fb
net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents:
7590
diff
changeset
|
618 |
10234
d4390c427a66
net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents:
10233
diff
changeset
|
619 if extra then |
d4390c427a66
net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents:
10233
diff
changeset
|
620 if extra.servername then |
d4390c427a66
net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents:
10233
diff
changeset
|
621 conn.servername = extra.servername; |
d4390c427a66
net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents:
10233
diff
changeset
|
622 end |
d4390c427a66
net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents:
10233
diff
changeset
|
623 end |
d4390c427a66
net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents:
10233
diff
changeset
|
624 |
9383
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
625 conn:updatenames(); |
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
626 return conn; |
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
627 end |
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
628 |
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
629 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
|
630 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
|
631 local ok, peername, peerport = pcall(conn.getpeername, conn); |
10330
d86b1304451a
net.server_epoll: Handle getpeer/sockname returning a normal error
Kim Alvefur <zash@zash.se>
parents:
10329
diff
changeset
|
632 if ok and peername then |
10854
472fe13a05f9
net.server_epoll: Handle missing ports from getsock/peername (as in the case of unix sockets)
Matthew Wild <mwild1@gmail.com>
parents:
10847
diff
changeset
|
633 self.peername, self.peerport = peername, peerport or 0; |
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
634 end |
9383
3260902a5b22
net.server_epoll: Factor out IP/port detection into its own method
Kim Alvefur <zash@zash.se>
parents:
9382
diff
changeset
|
635 local ok, sockname, sockport = pcall(conn.getsockname, conn); |
10330
d86b1304451a
net.server_epoll: Handle getpeer/sockname returning a normal error
Kim Alvefur <zash@zash.se>
parents:
10329
diff
changeset
|
636 if ok and sockname then |
10854
472fe13a05f9
net.server_epoll: Handle missing ports from getsock/peername (as in the case of unix sockets)
Matthew Wild <mwild1@gmail.com>
parents:
10847
diff
changeset
|
637 self.sockname, self.sockport = sockname, sockport or 0; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
638 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
639 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
640 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
641 -- A server interface has new incoming connections waiting |
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
642 -- This replaces the onreadable callback |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
643 function interface:onacceptable() |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
644 local conn, err = self.conn:accept(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
645 if not conn then |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
646 self:debug("Error accepting new client: %s, server will be paused for %ds", err, cfg.accept_retry_interval); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
647 self:pausefor(cfg.accept_retry_interval); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
648 return; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
649 end |
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
650 local client = wrapsocket(conn, self, nil, self.listeners); |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
651 client:debug("New connection %s on server %s", client, self); |
9430
412ff404bf58
net.server_epoll: Delay wrapping sockets in TLS until just before first handshake
Kim Alvefur <zash@zash.se>
parents:
9387
diff
changeset
|
652 client:init(); |
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
653 if self.tls_direct then |
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
654 client:starttls(self.tls_ctx); |
9695
5ec4eaf76de8
net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents:
9666
diff
changeset
|
655 else |
5ec4eaf76de8
net.server_epoll: Call onconnect right after accept()ing a new client
Kim Alvefur <zash@zash.se>
parents:
9666
diff
changeset
|
656 client:onconnect(); |
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
657 end |
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
658 end |
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
659 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
660 -- Initialization |
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
661 function interface:init() |
9824
729de68f0068
net.server_epoll: Separate timeout for initial connection attempts
Kim Alvefur <zash@zash.se>
parents:
9823
diff
changeset
|
662 self:setwritetimeout(cfg.connect_timeout); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
663 return self:add(true, true); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
664 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
665 |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
666 function interface:pause() |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
667 self:noise("Pause reading"); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
668 return self:set(false); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
669 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
670 |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
671 function interface:resume() |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
672 self:noise("Resume reading"); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
673 return self:set(true); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
674 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
675 |
7624 | 676 -- Pause connection for some time |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
677 function interface:pausefor(t) |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
678 self:noise("Pause for %fs", t); |
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
679 if self._pausefor then |
10985
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
680 closetimer(self._pausefor); |
758ce12586de
net.server_epoll: Optimize away table allocation for timer objects
Kim Alvefur <zash@zash.se>
parents:
10984
diff
changeset
|
681 self._pausefor = nil; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
682 end |
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
683 if t == false then return; end |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
684 self:set(false); |
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
685 self._pausefor = addtimer(t, function () |
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
686 self._pausefor = nil; |
9994
524b8cd76780
net.server_epoll: Restore wantread flag after pause (fixes #1354)
Kim Alvefur <zash@zash.se>
parents:
9932
diff
changeset
|
687 self:set(true); |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
688 self:noise("Resuming after pause, connection is %s", not self.conn and "missing" or self.conn:dirty() and "dirty" or "clean"); |
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
|
689 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
|
690 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
|
691 end |
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
692 end); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
693 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
694 |
10098
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
695 function interface:setlimit(Bps) |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
696 if Bps > 0 then |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
697 self._limit = 1/Bps; |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
698 else |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
699 self._limit = nil; |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
700 end |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
701 end |
dda1c7ccb209
server_epoll: Add native support for per socket bandwith limits
Kim Alvefur <zash@zash.se>
parents:
10091
diff
changeset
|
702 |
9581
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
703 function interface:pause_writes() |
10300
78f2a3a9c537
net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents:
10289
diff
changeset
|
704 if self._write_lock then |
78f2a3a9c537
net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents:
10289
diff
changeset
|
705 return |
78f2a3a9c537
net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents:
10289
diff
changeset
|
706 end |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
707 self:noise("Pause writes"); |
9581
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
708 self._write_lock = true; |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
709 self:setwritetimeout(false); |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
710 self:set(nil, false); |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
711 end |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
712 |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
713 function interface:resume_writes() |
10300
78f2a3a9c537
net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents:
10289
diff
changeset
|
714 if not self._write_lock then |
78f2a3a9c537
net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents:
10289
diff
changeset
|
715 return |
78f2a3a9c537
net.server_epoll: Return early when attepting to set write lock state to current state
Kim Alvefur <zash@zash.se>
parents:
10289
diff
changeset
|
716 end |
10587
863aa36a9dd8
net.server_epoll: Add option for reducing debug logging
Kim Alvefur <zash@zash.se>
parents:
10586
diff
changeset
|
717 self:noise("Resume writes"); |
9581
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
718 self._write_lock = nil; |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
719 if self.writebuffer[1] then |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
720 self:setwritetimeout(); |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
721 self:set(nil, true); |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
722 end |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
723 end |
1be99aedb0b3
net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents:
9573
diff
changeset
|
724 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
725 -- Connected! |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
726 function interface:onconnect() |
10638
92918212ee83
net.server_epoll: Different error to distinguish connection timeout
Kim Alvefur <zash@zash.se>
parents:
10589
diff
changeset
|
727 self._connected = true; |
9594
dcf466e04f81
net.server_epoll: Use method to update peername on connect
Kim Alvefur <zash@zash.se>
parents:
9587
diff
changeset
|
728 self:updatenames(); |
10331
76bd77ad6a2a
server_epoll: Log full string represestation when connected
Kim Alvefur <zash@zash.se>
parents:
10330
diff
changeset
|
729 self:debug("Connected (%s)", self); |
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
730 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
|
731 self:on("connect"); |
8506
174fd716c9fa
server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents:
8271
diff
changeset
|
732 end |
174fd716c9fa
server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents:
8271
diff
changeset
|
733 |
10861
e12690a37795
net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents:
10854
diff
changeset
|
734 local function wrapserver(conn, addr, port, listeners, config) |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
735 local server = setmetatable({ |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
736 conn = conn; |
10492
8e1d9bba9244
net.server_epoll: Use monotonic time for scheduling
Kim Alvefur <zash@zash.se>
parents:
10491
diff
changeset
|
737 created = realtime(); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
738 listeners = listeners; |
9835
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
739 read_size = config and config.read_size; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
740 onreadable = interface.onacceptable; |
9835
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
741 tls_ctx = config and config.tls_ctx; |
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
742 tls_direct = config and config.tls_direct; |
9847
adc0672b700e
net.server_epoll: Add support for SNI (#409)
Kim Alvefur <zash@zash.se>
parents:
9835
diff
changeset
|
743 hosts = config and config.sni_hosts; |
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
744 sockname = addr; |
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
745 sockport = port; |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
746 log = logger.init(("serv%s"):format(new_id())); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
747 }, interface_mt); |
10089
90e459f48cbd
net.server_epoll: Overhaul logging with one log sink per connection
Kim Alvefur <zash@zash.se>
parents:
10088
diff
changeset
|
748 server:debug("Server %s created", server); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
749 server:add(true, false); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
750 return server; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
751 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
752 |
10861
e12690a37795
net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents:
10854
diff
changeset
|
753 local function listen(addr, port, listeners, config) |
e12690a37795
net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents:
10854
diff
changeset
|
754 local conn, err = socket.bind(addr, port, cfg.tcp_backlog); |
e12690a37795
net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents:
10854
diff
changeset
|
755 if not conn then return conn, err; end |
e12690a37795
net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents:
10854
diff
changeset
|
756 conn:settimeout(0); |
e12690a37795
net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents:
10854
diff
changeset
|
757 return wrapserver(conn, addr, port, listeners, config); |
e12690a37795
net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents:
10854
diff
changeset
|
758 end |
e12690a37795
net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents:
10854
diff
changeset
|
759 |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
760 -- COMPAT |
9835
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
761 local function addserver(addr, port, listeners, read_size, tls_ctx) |
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
762 return listen(addr, port, listeners, { |
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
763 read_size = read_size; |
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
764 tls_ctx = tls_ctx; |
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
765 tls_direct = tls_ctx and true or false; |
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
766 }); |
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
767 end |
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
768 |
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
769 -- COMPAT |
10233
600eee3c4752
net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents:
10228
diff
changeset
|
770 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx, extra) |
600eee3c4752
net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents:
10228
diff
changeset
|
771 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra); |
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
772 if not client.peername then |
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
773 client.peername, client.peerport = addr, port; |
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
774 end |
9473
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
775 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
|
776 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
|
777 if tls_ctx then |
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
778 client:starttls(tls_ctx); |
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
779 end |
7551
838212918f11
net.server_epoll: Rename arguments and varibles for consistensy
Kim Alvefur <zash@zash.se>
parents:
7550
diff
changeset
|
780 return client; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
781 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
782 |
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
783 -- New outgoing TCP connection |
10233
600eee3c4752
net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents:
10228
diff
changeset
|
784 local function addclient(addr, port, listeners, read_size, tls_ctx, typ, extra) |
9497
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
785 local create; |
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
786 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
|
787 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
|
788 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
|
789 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
|
790 typ = "tcp6"; |
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
791 else |
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
792 typ = "tcp4"; |
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
793 end |
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
794 end |
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
795 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
|
796 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
|
797 end |
183ff7a8051b
net.server_epoll: Add support for the conn_type argument to addclient
Kim Alvefur <zash@zash.se>
parents:
9477
diff
changeset
|
798 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
|
799 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
|
800 end |
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
801 local conn, err = create(); |
10082
1df53ef1f60d
net.server_epoll: Return errors from creating sockets
Kim Alvefur <zash@zash.se>
parents:
10081
diff
changeset
|
802 if not conn then return conn, err; end |
9498
cc593002f2e2
net.server_epoll: Check return conditions of early socket setup
Kim Alvefur <zash@zash.se>
parents:
9497
diff
changeset
|
803 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
|
804 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
|
805 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
|
806 if not ok and err ~= "timeout" then return ok, err; end |
10233
600eee3c4752
net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents:
10228
diff
changeset
|
807 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra) |
9473
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
808 local ok, err = client:init(); |
10332
e05ea8223b32
net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents:
10331
diff
changeset
|
809 if not client.peername then |
e05ea8223b32
net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents:
10331
diff
changeset
|
810 -- otherwise not set until connected |
e05ea8223b32
net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents:
10331
diff
changeset
|
811 client.peername, client.peerport = addr, port; |
e05ea8223b32
net.server_epoll: Save IP and port from connection creation call
Kim Alvefur <zash@zash.se>
parents:
10331
diff
changeset
|
812 end |
9473
5fdda751333a
net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents:
9445
diff
changeset
|
813 if not ok then return ok, err; end |
10328
5c2b31c823b9
net.server_epoll: Move a log message to improve ordering
Kim Alvefur <zash@zash.se>
parents:
10309
diff
changeset
|
814 client:debug("Client %s created", client); |
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
815 if tls_ctx then |
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
816 client:starttls(tls_ctx); |
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
817 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
|
818 return client, conn; |
7553
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
819 end |
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
820 |
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
821 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
|
822 local conn = setmetatable({ |
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
823 conn = fd; |
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
824 onreadable = onreadable; |
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
825 onwritable = onwritable; |
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
826 close = function (self) |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
827 self:del(); |
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
828 end |
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
829 }, interface_mt); |
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
830 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
|
831 conn.getfd = function () |
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
832 return fd; |
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
833 end; |
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
834 -- 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
|
835 end |
10420
49a828819696
net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents:
10419
diff
changeset
|
836 conn.id = new_id(); |
49a828819696
net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents:
10419
diff
changeset
|
837 conn.log = logger.init(("fdwatch%s"):format(conn.id)); |
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
838 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
|
839 return conn; |
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
840 end; |
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
841 |
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
842 -- Dump all data from one connection into another |
10283
dff360d00dfa
net.server_epoll: Handle read size argument to link
Kim Alvefur <zash@zash.se>
parents:
10282
diff
changeset
|
843 local function link(from, to, read_size) |
10280
6b8b255f1d10
net.server_epoll: Add debug logging for various connection events
Kim Alvefur <zash@zash.se>
parents:
10279
diff
changeset
|
844 from:debug("Linking to %s", to.id); |
10284
cd669975031b
net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents:
10283
diff
changeset
|
845 function from:onincoming(data) |
cd669975031b
net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents:
10283
diff
changeset
|
846 self:pause(); |
10289
8c59b20f71dc
net.server_epoll: Correct indentation
Kim Alvefur <zash@zash.se>
parents:
10285
diff
changeset
|
847 to:write(data); |
10284
cd669975031b
net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents:
10283
diff
changeset
|
848 end |
10285
bcf61e22f841
net.server_epoll: Ignore unused self argument [luacheck]
Kim Alvefur <zash@zash.se>
parents:
10284
diff
changeset
|
849 function to:ondrain() -- luacheck: ignore 212/self |
10289
8c59b20f71dc
net.server_epoll: Correct indentation
Kim Alvefur <zash@zash.se>
parents:
10285
diff
changeset
|
850 from:resume(); |
10284
cd669975031b
net.server_epoll: Fix link function to not replace listeners
Kim Alvefur <zash@zash.se>
parents:
10283
diff
changeset
|
851 end |
10283
dff360d00dfa
net.server_epoll: Handle read size argument to link
Kim Alvefur <zash@zash.se>
parents:
10282
diff
changeset
|
852 from:set_mode(read_size); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
853 from:set(true, nil); |
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
854 to:set(nil, true); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
855 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
856 |
9438
916bee81eb7e
net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents:
9432
diff
changeset
|
857 -- COMPAT |
916bee81eb7e
net.server_epoll: Make :set_send a noop, should fix net.adns
Kim Alvefur <zash@zash.se>
parents:
9432
diff
changeset
|
858 -- 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
|
859 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
|
860 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
861 |
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
862 -- 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
|
863 local function closeall() |
7799
93643a61858a
server_epoll: Ignore unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7797
diff
changeset
|
864 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
|
865 conn:close(); |
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
866 end |
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
867 end |
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
868 |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
869 local quitting = nil; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
870 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
871 -- 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
|
872 local function setquitting(quit) |
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
873 if quit then |
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
874 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
|
875 closeall(); |
7796
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
876 else |
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
877 quitting = nil; |
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
878 end |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
879 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
880 |
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
881 -- 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
|
882 local function loop(once) |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
883 repeat |
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
884 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
|
885 local fd, r, w = poll:wait(t); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
886 if fd then |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
887 local conn = fds[fd]; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
888 if conn then |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
889 if r then |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
890 conn:onreadable(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
891 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
892 if w then |
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
893 conn:onwritable(); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
894 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
895 else |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
896 log("debug", "Removing unknown fd %d", fd); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
897 poll:del(fd); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
898 end |
9508
2055b497b515
net.server_epoll: Special handling of signal interrupts
Kim Alvefur <zash@zash.se>
parents:
9507
diff
changeset
|
899 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
|
900 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
|
901 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
|
902 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
|
903 return quitting; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
904 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
905 |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
906 return { |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
907 get_backend = function () return "epoll"; end; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
908 addserver = addserver; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
909 addclient = addclient; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
910 add_task = addtimer; |
10983
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
911 timer = { |
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
912 -- API-compatible with util.timer |
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
913 add_task = addtimer; |
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
914 stop = closetimer; |
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
915 reschedule = reschedule; |
10987
62355b801772
net.server_epoll: Expose way to turn monotonic time into wall clock time
Kim Alvefur <zash@zash.se>
parents:
10985
diff
changeset
|
916 to_absolute_time = function (t) |
62355b801772
net.server_epoll: Expose way to turn monotonic time into wall clock time
Kim Alvefur <zash@zash.se>
parents:
10985
diff
changeset
|
917 return t-monotonic()+realtime(); |
62355b801772
net.server_epoll: Expose way to turn monotonic time into wall clock time
Kim Alvefur <zash@zash.se>
parents:
10985
diff
changeset
|
918 end; |
10983
0862325842ec
net.server_epoll: Signal API-compatibilty with util.timer
Kim Alvefur <zash@zash.se>
parents:
10982
diff
changeset
|
919 }; |
9835
20bf5b47c1fb
net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents:
9825
diff
changeset
|
920 listen = listen; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
921 loop = loop; |
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
922 closeall = closeall; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
923 setquitting = setquitting; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
924 wrapclient = wrapclient; |
10861
e12690a37795
net.server_epoll: Add way to start accepting clients on an arbitrary server socket
Kim Alvefur <zash@zash.se>
parents:
10854
diff
changeset
|
925 wrapserver = wrapserver; |
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
926 watchfd = watchfd; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
927 link = link; |
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
928 set_config = function (newconfig) |
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
929 cfg = setmetatable(newconfig, default_config); |
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
930 end; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
931 |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
932 -- libevent emulation |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
933 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
|
934 addevent = function (fd, mode, callback) |
10088
97da8452c6a6
net.server_epoll: Deprecate libevent emulation layer
Kim Alvefur <zash@zash.se>
parents:
10082
diff
changeset
|
935 log("warn", "Using deprecated libevent emulation, please update code to use watchfd API instead"); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
936 local function onevent(self) |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
937 local ret = self:callback(); |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
938 if ret == -1 then |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
939 self:set(false, false); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
940 elseif ret then |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
941 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
|
942 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
943 end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
944 |
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
945 local conn = setmetatable({ |
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
946 getfd = function () return fd; end; |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
947 callback = callback; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
948 onreadable = onevent; |
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
949 onwritable = onevent; |
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
950 close = function (self) |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
951 self:del(); |
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
952 fds[fd] = nil; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
953 end; |
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
954 }, interface_mt); |
10420
49a828819696
net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents:
10419
diff
changeset
|
955 conn.id = conn:getfd(); |
49a828819696
net.server_epoll: Save log tag in a field on FD watchers too
Kim Alvefur <zash@zash.se>
parents:
10419
diff
changeset
|
956 conn.log = logger.init(("fdwatch%d"):format(conn.id)); |
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
957 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
|
958 if not ok then return ok, err; end |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
959 return conn; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
960 end; |
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
961 }; |