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