Annotate

net/server_event.lua @ 11057:13eee48071c8

MUC: Don't default room name to JID localpart (API breaking change) Behavior with turning empty name into localpart was originally introduced in 711eb5bf94b4 This has caused some problems for clients, making it difficult to differentiate between a room actually named like the localpart from a room without a name. Breaking: The function signature of the :get_name() method changes from always returning a string to optional string.
author Kim Alvefur <zash@zash.se>
date Sat, 29 Aug 2020 18:51:13 +0200
parent 10547:c77471c180ea
child 11068:988ddd57e851
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
1 --[[
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
2
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
3
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
4 server.lua based on lua/libevent by blastbeat
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
5
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
6 notes:
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
7 -- when using luaevent, never register 2 or more EV_READ at one socket, same for EV_WRITE
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
8 -- you can't even register a new EV_READ/EV_WRITE callback inside another one
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
9 -- to do some of the above, use timeout events or something what will called from outside
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
10 -- don't let garbagecollect eventcallbacks, as long they are running
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
11 -- when using luasec, there are 4 cases of timeout errors: wantread or wantwrite during reading or writing
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
12
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
13 --]]
6852
626d8152b1ad server_event: Add luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 6851
diff changeset
14 -- luacheck: ignore 212/self 431/err 211/ret
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
15
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
16 local SCRIPT_NAME = "server_event.lua"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
17 local SCRIPT_VERSION = "0.05"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
18 local SCRIPT_AUTHOR = "blastbeat"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
19 local LAST_MODIFIED = "2009/11/20"
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
20
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
21 local cfg = {
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
22 MAX_CONNECTIONS = 100000, -- max per server connections (use "ulimit -n" on *nix)
3237
721a83a3beb9 net.server_event: attemp to fix more spelling fail.
Waqas Hussain <waqas20@gmail.com>
parents: 3149
diff changeset
23 MAX_HANDSHAKE_ATTEMPTS= 1000, -- attempts to finish ssl handshake
721a83a3beb9 net.server_event: attemp to fix more spelling fail.
Waqas Hussain <waqas20@gmail.com>
parents: 3149
diff changeset
24 HANDSHAKE_TIMEOUT = 60, -- timeout in seconds per handshake attempt
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
25 MAX_READ_LENGTH = 1024 * 1024 * 1024 * 1024, -- max bytes allowed to read from sockets
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
26 MAX_SEND_LENGTH = 1024 * 1024 * 1024 * 1024, -- max bytes size of write buffer (for writing on sockets)
5531
483f795f6f99 net.server*: Allow the TCP backlog parameter to be set in the config
Kim Alvefur <zash@zash.se>
parents: 5339
diff changeset
27 ACCEPT_QUEUE = 128, -- might influence the length of the pending sockets queue
2952
5069534f7f36 net.server_event: Fixed spelling fail.
Waqas Hussain <waqas20@gmail.com>
parents: 2941
diff changeset
28 ACCEPT_DELAY = 10, -- seconds to wait until the next attempt of a full server to accept
8983
23f66f04e216 net.server: Set default read timeout to 14 minutes (fixes #971)
Kim Alvefur <zash@zash.se>
parents: 8781
diff changeset
29 READ_TIMEOUT = 14 * 60, -- timeout in seconds for read data from socket
2939
dc73cbc69bd5 net.server_event: Bump timeout values up somewhat
Matthew Wild <mwild1@gmail.com>
parents: 2731
diff changeset
30 WRITE_TIMEOUT = 180, -- timeout in seconds for write data on socket
2952
5069534f7f36 net.server_event: Fixed spelling fail.
Waqas Hussain <waqas20@gmail.com>
parents: 2941
diff changeset
31 CONNECT_TIMEOUT = 20, -- timeout in seconds for connection attempts
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
32 CLEAR_DELAY = 5, -- seconds to wait for clearing interface list (and calling ondisconnect listeners)
7420
3fc5560557a5 net.server_event: Schedule another read callback if there is still data left in buffer after reading (fixes #583 for real)
Kim Alvefur <zash@zash.se>
parents: 7419
diff changeset
33 READ_RETRY_DELAY = 1e-06, -- if, after reading, there is still data in buffer, wait this long and continue reading
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
34 DEBUG = true, -- show debug messages
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
35 }
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
36
6850
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
37 local pairs = pairs
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
38 local select = select
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
39 local require = require
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
40 local tostring = tostring
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
41 local setmetatable = setmetatable
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
42
5286
0cbe57fbe2cd net.server_event: Optimize socket write buffers (don't do buf=buf..newdata).
Waqas Hussain <waqas20@gmail.com>
parents: 5277
diff changeset
43 local t_insert = table.insert
0cbe57fbe2cd net.server_event: Optimize socket write buffers (don't do buf=buf..newdata).
Waqas Hussain <waqas20@gmail.com>
parents: 5277
diff changeset
44 local t_concat = table.concat
6850
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
45 local s_sub = string.sub
5286
0cbe57fbe2cd net.server_event: Optimize socket write buffers (don't do buf=buf..newdata).
Waqas Hussain <waqas20@gmail.com>
parents: 5277
diff changeset
46
6850
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
47 local coroutine_wrap = coroutine.wrap
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
48 local coroutine_yield = coroutine.yield
5286
0cbe57fbe2cd net.server_event: Optimize socket write buffers (don't do buf=buf..newdata).
Waqas Hussain <waqas20@gmail.com>
parents: 5277
diff changeset
49
6782
ec172dbe9d14 net.server_{select,event}: Don't rely on LuaSocket and LuaSec being present in the globals table
Kim Alvefur <zash@zash.se>
parents: 6382
diff changeset
50 local has_luasec, ssl = pcall ( require , "ssl" )
6850
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
51 local socket = require "socket"
6853
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
52 local levent = require "luaevent.core"
9473
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
53 local inet = require "util.net";
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
54 local inet_pton = inet.pton;
6850
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
55
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
56 local socket_gettime = socket.gettime
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
57
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
58 local log = require ("util.logger").init("socket")
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
59
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
60 local function debug(...)
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
61 return log("debug", ("%s "):rep(select('#', ...)), ...)
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
62 end
6855
40236602ab5b server_event: Comment out the unused vdebug function [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6854
diff changeset
63 -- local vdebug = debug;
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
64
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
65 local bitor = ( function( ) -- thx Rici Lake
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
66 local hasbit = function( x, p )
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
67 return x % ( p + p ) >= p
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
68 end
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
69 return function( x, y )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
70 local p = 1
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
71 local z = 0
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
72 local limit = x > y and x or y
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
73 while p <= limit do
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
74 if hasbit( x, p ) or hasbit( y, p ) then
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
75 z = z + p
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
76 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
77 p = p + p
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
78 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
79 return z
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
80 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
81 end )( )
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
82
6853
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
83 local base = levent.new( )
6850
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
84 local addevent = base.addevent
6853
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
85 local EV_READ = levent.EV_READ
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
86 local EV_WRITE = levent.EV_WRITE
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
87 local EV_TIMEOUT = levent.EV_TIMEOUT
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
88 local EV_SIGNAL = levent.EV_SIGNAL
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
89
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
90 local EV_READWRITE = bitor( EV_READ, EV_WRITE )
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
91
6849
0455b9686e16 server_event: Replace implementation of ordered set with a simple table set
Kim Alvefur <zash@zash.se>
parents: 6819
diff changeset
92 local interfacelist = { }
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
93
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
94 -- Client interface methods
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
95 local interface_mt = {}; interface_mt.__index = interface_mt;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
96
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
97 -- Private methods
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
98 function interface_mt:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
99 return self:_destroy();
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
100 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
101
7339
b5565715fce8 server_event: addclient: wrapclient already calls startconnection for us [backported from trunk]
daurnimator <quae@daurnimator.com>
parents: 7337
diff changeset
102 function interface_mt:_start_connection(plainssl) -- called from wrapclient
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
103 local callback = function( event )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
104 if EV_TIMEOUT == event then -- timeout during connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
105 self.fatalerror = "connection timeout"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
106 self:ontimeout() -- call timeout listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
107 self:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
108 debug( "new connection failed. id:", self.id, "error:", self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
109 else
8530
075df839c110 net.server_event: Not every instantly-readable connection is an error, continue if possible
Matthew Wild <mwild1@gmail.com>
parents: 8529
diff changeset
110 if EV_READWRITE == event then
075df839c110 net.server_event: Not every instantly-readable connection is an error, continue if possible
Matthew Wild <mwild1@gmail.com>
parents: 8529
diff changeset
111 if self.readcallback(event) == -1 then
075df839c110 net.server_event: Not every instantly-readable connection is an error, continue if possible
Matthew Wild <mwild1@gmail.com>
parents: 8529
diff changeset
112 -- Fatal error occurred
075df839c110 net.server_event: Not every instantly-readable connection is an error, continue if possible
Matthew Wild <mwild1@gmail.com>
parents: 8529
diff changeset
113 return -1;
075df839c110 net.server_event: Not every instantly-readable connection is an error, continue if possible
Matthew Wild <mwild1@gmail.com>
parents: 8529
diff changeset
114 end
075df839c110 net.server_event: Not every instantly-readable connection is an error, continue if possible
Matthew Wild <mwild1@gmail.com>
parents: 8529
diff changeset
115 end
6858
d8f8c0b2fda8 server_event: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6856
diff changeset
116 if plainssl and has_luasec then -- start ssl session
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
117 self:starttls(self._sslctx, true)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
118 else -- normal connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
119 self:_start_session(true)
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
120 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
121 debug( "new connection established. id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
122 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
123 self.eventconnect = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
124 return -1
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
125 end
8529
257fd322fc9f net.server_event: Better outgoing connection error handling
Matthew Wild <mwild1@gmail.com>
parents: 8384
diff changeset
126 self.eventconnect = addevent( base, self.conn, EV_READWRITE, callback, cfg.CONNECT_TIMEOUT )
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
127 return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
128 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
129 function interface_mt:_start_session(call_onconnect) -- new session, for example after startssl
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
130 if self.type == "client" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
131 local callback = function( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
132 self:_lock( false, false, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
133 --vdebug( "start listening on client socket with id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
134 self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT ); -- register callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
135 if call_onconnect then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
136 self:onconnect()
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
137 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
138 self.eventsession = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
139 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
140 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
141 self.eventsession = addevent( base, nil, EV_TIMEOUT, callback, 0 )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
142 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
143 self:_lock( false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
144 --vdebug( "start listening on server socket with id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
145 self.eventread = addevent( base, self.conn, EV_READ, self.readcallback ) -- register callback
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
146 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
147 return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
148 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
149 function interface_mt:_start_ssl(call_onconnect) -- old socket will be destroyed, therefore we have to close read/write events first
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
150 --vdebug( "starting ssl session with client id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
151 local _
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
152 _ = self.eventread and self.eventread:close( ) -- close events; this must be called outside of the event callbacks!
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
153 _ = self.eventwrite and self.eventwrite:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
154 self.eventread, self.eventwrite = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
155 local err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
156 self.conn, err = ssl.wrap( self.conn, self._sslctx )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
157 if err then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
158 self.fatalerror = err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
159 self.conn = nil -- cannot be used anymore
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
160 if call_onconnect then
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
161 self.ondisconnect = nil -- don't call this when client isn't really connected
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
162 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
163 self:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
164 debug( "fatal error while ssl wrapping:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
165 return false
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
166 end
9850
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
167
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
168 if self.conn.sni then
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
169 if self.servername then
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
170 self.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: 9850
diff changeset
171 elseif self._server and type(self._server.hosts) == "table" and next(self._server.hosts) ~= nil then
9850
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
172 self.conn:sni(self._server.hosts, true);
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
173 end
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
174 end
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
175
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
176 self.conn:settimeout( 0 ) -- set non blocking
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
177 local handshakecallback = coroutine_wrap(function( event )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
178 local _, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
179 local attempt = 0
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
180 local maxattempt = cfg.MAX_HANDSHAKE_ATTEMPTS
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
181 while attempt < maxattempt do -- no endless loop
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
182 attempt = attempt + 1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
183 debug( "ssl handshake of client with id:"..tostring(self)..", attempt:"..attempt )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
184 if attempt > maxattempt then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
185 self.fatalerror = "max handshake attempts exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
186 elseif EV_TIMEOUT == event then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
187 self.fatalerror = "timeout during handshake"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
188 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
189 _, err = self.conn:dohandshake( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
190 if not err then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
191 self:_lock( false, false, false ) -- unlock the interface; sending, closing etc allowed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
192 self.send = self.conn.send -- caching table lookups with new client object
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
193 self.receive = self.conn.receive
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
194 if not call_onconnect then -- trigger listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
195 self:onstatus("ssl-handshake-complete");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
196 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
197 self:_start_session( call_onconnect )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
198 debug( "ssl handshake done" )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
199 self.eventhandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
200 return -1
3396
23cf369ed1c3 net.server_event: Fix to not call onconnect a second time after the SSL handshake for starttls connections (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents: 3387
diff changeset
201 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
202 if err == "wantwrite" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
203 event = EV_WRITE
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
204 elseif err == "wantread" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
205 event = EV_READ
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
206 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
207 debug( "ssl handshake error:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
208 self.fatalerror = err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
209 end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
210 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
211 if self.fatalerror then
3396
23cf369ed1c3 net.server_event: Fix to not call onconnect a second time after the SSL handshake for starttls connections (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents: 3387
diff changeset
212 if call_onconnect then
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
213 self.ondisconnect = nil -- don't call this when client isn't really connected
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
214 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
215 self:_close()
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
216 debug( "handshake failed because:", self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
217 self.eventhandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
218 return -1
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
219 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
220 event = coroutine_yield( event, cfg.HANDSHAKE_TIMEOUT ) -- yield this monster...
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
221 end
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
222 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
223 )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
224 debug "starting handshake..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
225 self:_lock( false, true, true ) -- unlock read/write events, but keep interface locked
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
226 self.eventhandshake = addevent( base, self.conn, EV_READWRITE, handshakecallback, cfg.HANDSHAKE_TIMEOUT )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
227 return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
228 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
229 function interface_mt:_destroy() -- close this interface + events and call last listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
230 debug( "closing client with id:", self.id, self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
231 self:_lock( true, true, true ) -- first of all, lock the interface to avoid further actions
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
232 local _
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
233 _ = self.eventread and self.eventread:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
234 if self.type == "client" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
235 _ = self.eventwrite and self.eventwrite:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
236 _ = self.eventhandshake and self.eventhandshake:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
237 _ = self.eventstarthandshake and self.eventstarthandshake:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
238 _ = self.eventconnect and self.eventconnect:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
239 _ = self.eventsession and self.eventsession:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
240 _ = self.eventwritetimeout and self.eventwritetimeout:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
241 _ = self.eventreadtimeout and self.eventreadtimeout:close( )
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
242 -- call ondisconnect listener (won't be the case if handshake failed on connect)
8384
4a5c6f6214ee net.server_event: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8314
diff changeset
243 _ = self.ondisconnect and self:ondisconnect( self.fatalerror ~= "client to close" and self.fatalerror)
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
244 _ = self.conn and self.conn:close( ) -- close connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
245 _ = self._server and self._server:counter(-1);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
246 self.eventread, self.eventwrite = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
247 self.eventstarthandshake, self.eventhandshake, self.eventclose = nil, nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
248 self.readcallback, self.writecallback = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
249 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
250 self.conn:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
251 self.eventread, self.eventclose = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
252 self.interface, self.readcallback = nil, nil
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
253 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
254 interfacelist[ self ] = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
255 return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
256 end
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
257
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
258 function interface_mt:_lock(nointerface, noreading, nowriting) -- lock or unlock this interface or events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
259 self.nointerface, self.noreading, self.nowriting = nointerface, noreading, nowriting
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
260 return nointerface, noreading, nowriting
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
261 end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
262
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
263 --TODO: Deprecate
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
264 function interface_mt:lock_read(switch)
9575
1fb3e7c550bf net.server_event: Deprecate :lock_read here too
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
265 log("warn", ":lock_read is deprecated, use :pasue() and :resume()");
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
266 if switch then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
267 return self:pause();
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
268 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
269 return self:resume();
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
270 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
271 end
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
272
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
273 function interface_mt:pause()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
274 return self:_lock(self.nointerface, true, self.nowriting);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
275 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
276
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
277 function interface_mt:resume()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
278 self:_lock(self.nointerface, false, self.nowriting);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
279 if self.readcallback and not self.eventread then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
280 self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT ); -- register callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
281 return true;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
282 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
283 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
284
9581
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
285 function interface_mt:pause_writes()
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
286 return self:_lock(self.nointerface, self.noreading, true);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
287 end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
288
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
289 function interface_mt:resume_writes()
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
290 self:_lock(self.nointerface, self.noreading, false);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
291 if self.writecallback and not self.eventwrite then
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
292 self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT ); -- register callback
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
293 return true;
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
294 end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
295 end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
296
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
297
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
298 function interface_mt:counter(c)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
299 if c then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
300 self._connections = self._connections + c
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
301 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
302 return self._connections
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
303 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
304
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
305 -- Public methods
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
306 function interface_mt:write(data)
9915
9fe7b18bca15 net.server_event: Allow writing into buffer of write-locked connections
Kim Alvefur <zash@zash.se>
parents: 9897
diff changeset
307 if self.nointerface then return nil, "locked"; end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
308 --vdebug( "try to send data to client, id/data:", self.id, data )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
309 data = tostring( data )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
310 local len = #data
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
311 local total = len + self.writebufferlen
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
312 if total > cfg.MAX_SEND_LENGTH then -- check buffer length
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
313 local err = "send buffer exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
314 debug( "error:", err ) -- to much, check your app
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
315 return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
316 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
317 t_insert(self.writebuffer, data) -- new buffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
318 self.writebufferlen = total
9915
9fe7b18bca15 net.server_event: Allow writing into buffer of write-locked connections
Kim Alvefur <zash@zash.se>
parents: 9897
diff changeset
319 if not self.eventwrite and not self.nowriting then -- register new write event
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
320 --vdebug( "register new write event" )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
321 self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
322 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
323 return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
324 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
325 function interface_mt:close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
326 if self.nointerface then return nil, "locked"; end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
327 debug( "try to close client connection with id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
328 if self.type == "client" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
329 self.fatalerror = "client to close"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
330 if self.eventwrite then -- wait for incomplete write request
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
331 self:_lock( true, true, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
332 debug "closing delayed until writebuffer is empty"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
333 return nil, "writebuffer not empty, waiting"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
334 else -- close now
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
335 self:_lock( true, true, true )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
336 self:_close()
4676
1ce2ff9ec313 net.server_event: Do not automatically close clients when closing a server port
Matthew Wild <mwild1@gmail.com>
parents: 4468
diff changeset
337 return true
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
338 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
339 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
340 debug( "try to close server with id:", tostring(self.id))
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
341 self.fatalerror = "server to close"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
342 self:_lock( true )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
343 self:_close( 0 )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
344 return true
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
345 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
346 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
347
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
348 function interface_mt:socket()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
349 return self.conn
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
350 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
351
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
352 function interface_mt:server()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
353 return self._server or self;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
354 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
355
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
356 function interface_mt:port()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
357 return self._port
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
358 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
359
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
360 function interface_mt:serverport()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
361 return self._serverport
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
362 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
363
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
364 function interface_mt:ip()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
365 return self._ip
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
366 end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
367
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
368 function interface_mt:ssl()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
369 return self._usingssl
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
370 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
371 interface_mt.clientport = interface_mt.port -- COMPAT server_select
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
372
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
373 function interface_mt:type()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
374 return self._type or "client"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
375 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
376
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
377 function interface_mt:connections()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
378 return self._connections
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
379 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
380
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
381 function interface_mt:address()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
382 return self.addr
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
383 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
384
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
385 function interface_mt:set_sslctx(sslctx)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
386 self._sslctx = sslctx;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
387 if sslctx then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
388 self.starttls = nil; -- use starttls() of interface_mt
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
389 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
390 self.starttls = false; -- prevent starttls()
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
391 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
392 end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
393
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
394 function interface_mt:set_mode(pattern)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
395 if pattern then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
396 self._pattern = pattern;
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
397 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
398 return self._pattern;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
399 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
400
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
401 function interface_mt:set_send(new_send) -- luacheck: ignore 212
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
402 -- No-op, we always use the underlying connection's send
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
403 end
3001
fa00c6f563b4 net.server_select, net.server_event: Rename :pattern() method to :set_mode() for select backend, and add :set_mode() to event backend
Matthew Wild <mwild1@gmail.com>
parents: 3000
diff changeset
404
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
405 function interface_mt:starttls(sslctx, call_onconnect)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
406 debug( "try to start ssl at client id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
407 local err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
408 self._sslctx = sslctx;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
409 if self._usingssl then -- startssl was already called
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
410 err = "ssl already active"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
411 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
412 if err then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
413 debug( "error:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
414 return nil, err
3001
fa00c6f563b4 net.server_select, net.server_event: Rename :pattern() method to :set_mode() for select backend, and add :set_mode() to event backend
Matthew Wild <mwild1@gmail.com>
parents: 3000
diff changeset
415 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
416 self._usingssl = true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
417 self.startsslcallback = function( ) -- we have to start the handshake outside of a read/write event
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
418 self.startsslcallback = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
419 self:_start_ssl(call_onconnect);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
420 self.eventstarthandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
421 return -1
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
422 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
423 if not self.eventwrite then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
424 self:_lock( true, true, true ) -- lock the interface, to not disturb the handshake
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
425 self.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, self.startsslcallback, 0 ) -- add event to start handshake
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
426 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
427 -- wait until writebuffer is empty
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
428 self:_lock( true, true, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
429 debug "ssl session delayed until writebuffer is empty..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
430 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
431 self.starttls = false;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
432 return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
433 end
5625
e67891ad18d6 net.server_event: Add support for listener.onreadtimeout(conn), which can return true to prevent the connection from being closed when a read timeout occurs
Matthew Wild <mwild1@gmail.com>
parents: 5531
diff changeset
434
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
435 function interface_mt:setoption(option, value)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
436 if self.conn.setoption then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
437 return self.conn:setoption(option, value);
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
438 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
439 return false, "setoption not implemented";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
440 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
441
9387
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
442 function interface_mt:setlistener(listener, data)
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
443 self:ondetach(); -- Notify listener that it is no longer responsible for this connection
7337
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7336
diff changeset
444 self.onconnect = listener.onconnect;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7336
diff changeset
445 self.ondisconnect = listener.ondisconnect;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7336
diff changeset
446 self.onincoming = listener.onincoming;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7336
diff changeset
447 self.ontimeout = listener.ontimeout;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7336
diff changeset
448 self.onreadtimeout = listener.onreadtimeout;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7336
diff changeset
449 self.onstatus = listener.onstatus;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7336
diff changeset
450 self.ondetach = listener.ondetach;
9385
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
451 self.onattach = listener.onattach;
7809
34ca48325ce7 net.server_event: Also replace 'ondrain' when setting new listeners (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7688
diff changeset
452 self.ondrain = listener.ondrain;
9387
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
453 self:onattach(data);
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
454 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
455
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
456 -- Stub handlers
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
457 function interface_mt:onconnect()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
458 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
459 function interface_mt:onincoming()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
460 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
461 function interface_mt:ondisconnect()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
462 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
463 function interface_mt:ontimeout()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
464 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
465 function interface_mt:onreadtimeout()
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
466 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
467 function interface_mt:ondrain()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
468 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
469 function interface_mt:ondetach()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
470 end
9385
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
471 function interface_mt:onattach()
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
472 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
473 function interface_mt:onstatus()
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
474 end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
475
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
476 -- End of client interface methods
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
477
10233
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
478 local function handleclient( client, ip, port, server, pattern, listener, sslctx, extra ) -- creates an client interface
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
479 --vdebug("creating client interfacce...")
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
480 local interface = {
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
481 type = "client";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
482 conn = client;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
483 currenttime = socket_gettime( ); -- safe the origin
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
484 writebuffer = {}; -- writebuffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
485 writebufferlen = 0; -- length of writebuffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
486 send = client.send; -- caching table lookups
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
487 receive = client.receive;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
488 onconnect = listener.onconnect; -- will be called when client disconnects
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
489 ondisconnect = listener.ondisconnect; -- will be called when client disconnects
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
490 onincoming = listener.onincoming; -- will be called when client sends data
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
491 ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
492 onreadtimeout = listener.onreadtimeout; -- called when socket inactivity timeout occurs
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
493 ondrain = listener.ondrain; -- called when writebuffer is empty
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
494 ondetach = listener.ondetach; -- called when disassociating this listener from this connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
495 onstatus = listener.onstatus; -- called for status changes (e.g. of SSL/TLS)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
496 eventread = false, eventwrite = false, eventclose = false,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
497 eventhandshake = false, eventstarthandshake = false; -- event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
498 eventconnect = false, eventsession = false; -- more event handler...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
499 eventwritetimeout = false; -- even more event handler...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
500 eventreadtimeout = false;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
501 fatalerror = false; -- error message
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
502 writecallback = false; -- will be called on write events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
503 readcallback = false; -- will be called on read events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
504 nointerface = true; -- lock/unlock parameter of this interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
505 noreading = false, nowriting = false; -- locks of the read/writecallback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
506 startsslcallback = false; -- starting handshake callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
507 position = false; -- position of client in interfacelist
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
508
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
509 -- Properties
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
510 _ip = ip, _port = port, _server = server, _pattern = pattern,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
511 _serverport = (server and server:port() or nil),
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
512 _sslctx = sslctx; -- parameters
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
513 _usingssl = false; -- client is using ssl;
10233
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
514 extra = extra;
10234
d4390c427a66 net.server: Handle server name (SNI) as extra argument
Kim Alvefur <zash@zash.se>
parents: 10233
diff changeset
515 servername = extra and extra.servername;
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
516 }
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
517 if not has_luasec then interface.starttls = false; end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
518 interface.id = tostring(interface):match("%x+$");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
519 interface.writecallback = function( event ) -- called on write events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
520 --vdebug( "new client write event, id/ip/port:", interface, ip, port )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
521 if interface.nowriting or ( interface.fatalerror and ( "client to close" ~= interface.fatalerror ) ) then -- leave this event
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
522 --vdebug( "leaving this event because:", interface.nowriting or interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
523 interface.eventwrite = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
524 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
525 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
526 if EV_TIMEOUT == event then -- took too long to write some data to socket -> disconnect
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
527 interface.fatalerror = "timeout during writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
528 debug( "writing failed:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
529 interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
530 interface.eventwrite = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
531 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
532 else -- can write :)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
533 if interface._usingssl then -- handle luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
534 if interface.eventreadtimeout then -- we have to read first
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
535 local ret = interface.readcallback( ) -- call readcallback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
536 --vdebug( "tried to read in writecallback, result:", ret )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
537 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
538 if interface.eventwritetimeout then -- luasec only
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
539 interface.eventwritetimeout:close( ) -- first we have to close timeout event which where regged after a wantread error
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
540 interface.eventwritetimeout = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
541 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
542 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
543 interface.writebuffer = { t_concat(interface.writebuffer) }
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
544 local succ, err, byte = interface.conn:send( interface.writebuffer[1], 1, interface.writebufferlen )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
545 --vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte )
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
546 if succ then -- writing successful
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
547 interface.writebuffer[1] = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
548 interface.writebufferlen = 0
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
549 interface:ondrain();
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
550 if interface.fatalerror then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
551 debug "closing client after writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
552 interface:_close() -- close interface if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
553 elseif interface.startsslcallback then -- start ssl connection if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
554 debug "starting ssl handshake after writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
555 interface.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, interface.startsslcallback, 0 )
7399
066a4dfdac18 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7394 7398
diff changeset
556 elseif interface.writebufferlen ~= 0 then
7394
a700d54c620a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7385 7393
diff changeset
557 -- data possibly written from ondrain
a700d54c620a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7385 7393
diff changeset
558 return EV_WRITE, cfg.WRITE_TIMEOUT
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
559 elseif interface.eventreadtimeout then
7385
17929cdacec2 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7339 7384
diff changeset
560 return EV_WRITE, cfg.WRITE_TIMEOUT
17929cdacec2 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7339 7384
diff changeset
561 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
562 interface.eventwrite = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
563 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
564 elseif byte and (err == "timeout" or err == "wantwrite") then -- want write again
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
565 --vdebug( "writebuffer is not empty:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
566 interface.writebuffer[1] = s_sub( interface.writebuffer[1], byte + 1, interface.writebufferlen ) -- new buffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
567 interface.writebufferlen = interface.writebufferlen - byte
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
568 if "wantread" == err then -- happens only with luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
569 local callback = function( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
570 interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
571 interface.eventwritetimeout = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
572 return -1;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
573 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
574 interface.eventwritetimeout = addevent( base, nil, EV_TIMEOUT, callback, cfg.WRITE_TIMEOUT ) -- reg a new timeout event
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
575 debug( "wantread during write attempt, reg it in readcallback but don't know what really happens next..." )
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
576 -- hopefully this works with luasec; its simply not possible to use 2 different write events on a socket in luaevent
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
577 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
578 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
579 return EV_WRITE, cfg.WRITE_TIMEOUT
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
580 else -- connection was closed during writing or fatal error
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
581 interface.fatalerror = err or "fatal error"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
582 debug( "connection failed in write event:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
583 interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
584 interface.eventwrite = nil
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
585 return -1
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
586 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
587 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
588 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
589
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
590 interface.readcallback = function( event ) -- called on read events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
591 --vdebug( "new client read event, id/ip/port:", tostring(interface.id), tostring(ip), tostring(port) )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
592 if interface.noreading or interface.fatalerror then -- leave this event
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
593 --vdebug( "leaving this event because:", tostring(interface.noreading or interface.fatalerror) )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
594 interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
595 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
596 end
7420
3fc5560557a5 net.server_event: Schedule another read callback if there is still data left in buffer after reading (fixes #583 for real)
Kim Alvefur <zash@zash.se>
parents: 7419
diff changeset
597 if EV_TIMEOUT == event and not interface.conn:dirty() and interface:onreadtimeout() ~= true then
7688
88ad2d5bcf80 net.server_event: Restore destruction of socket on read timeout (lost since e67891ad18d6) (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7420
diff changeset
598 interface.fatalerror = "timeout during receiving"
88ad2d5bcf80 net.server_event: Restore destruction of socket on read timeout (lost since e67891ad18d6) (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7420
diff changeset
599 debug( "connection failed:", interface.fatalerror )
88ad2d5bcf80 net.server_event: Restore destruction of socket on read timeout (lost since e67891ad18d6) (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7420
diff changeset
600 interface:_close()
88ad2d5bcf80 net.server_event: Restore destruction of socket on read timeout (lost since e67891ad18d6) (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7420
diff changeset
601 interface.eventread = nil
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
602 return -1 -- took too long to get some data from client -> disconnect
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
603 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
604 if interface._usingssl then -- handle luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
605 if interface.eventwritetimeout then -- ok, in the past writecallback was regged
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
606 local ret = interface.writecallback( ) -- call it
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
607 --vdebug( "tried to write in readcallback, result:", tostring(ret) )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
608 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
609 if interface.eventreadtimeout then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
610 interface.eventreadtimeout:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
611 interface.eventreadtimeout = nil
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
612 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
613 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
614 local buffer, err, part = interface.conn:receive( interface._pattern ) -- receive buffer with "pattern"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
615 --vdebug( "read data:", tostring(buffer), "error:", tostring(err), "part:", tostring(part) )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
616 buffer = buffer or part
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
617 if buffer and #buffer > cfg.MAX_READ_LENGTH then -- check buffer length
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
618 interface.fatalerror = "receive buffer exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
619 debug( "fatal error:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
620 interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
621 interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
622 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
623 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
624 if err and ( err ~= "timeout" and err ~= "wantread" ) then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
625 if "wantwrite" == err then -- need to read on write event
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
626 if not interface.eventwrite then -- register new write event if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
627 interface.eventwrite = addevent( base, interface.conn, EV_WRITE, interface.writecallback, cfg.WRITE_TIMEOUT )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
628 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
629 interface.eventreadtimeout = addevent( base, nil, EV_TIMEOUT,
7419
325c03f5481b net.server_event: Collect entire one line function on one line
Kim Alvefur <zash@zash.se>
parents: 7399
diff changeset
630 function( ) interface:_close() end, cfg.READ_TIMEOUT)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
631 debug( "wantwrite during read attempt, reg it in writecallback but don't know what really happens next..." )
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
632 -- to be honest i don't know what happens next, if it is allowed to first read, the write etc...
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
633 else -- connection was closed or fatal error
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
634 interface.fatalerror = err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
635 debug( "connection failed in read event:", interface.fatalerror )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
636 interface:_close()
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
637 interface.eventread = nil
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
638 return -1
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
639 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
640 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
641 interface.onincoming( interface, buffer, err ) -- send new data to listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
642 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
643 if interface.noreading then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
644 interface.eventread = nil;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
645 return -1;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
646 end
7420
3fc5560557a5 net.server_event: Schedule another read callback if there is still data left in buffer after reading (fixes #583 for real)
Kim Alvefur <zash@zash.se>
parents: 7419
diff changeset
647 if interface.conn:dirty() then -- still data left in buffer
3fc5560557a5 net.server_event: Schedule another read callback if there is still data left in buffer after reading (fixes #583 for real)
Kim Alvefur <zash@zash.se>
parents: 7419
diff changeset
648 return EV_TIMEOUT, cfg.READ_RETRY_DELAY;
3fc5560557a5 net.server_event: Schedule another read callback if there is still data left in buffer after reading (fixes #583 for real)
Kim Alvefur <zash@zash.se>
parents: 7419
diff changeset
649 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
650 return EV_READ, cfg.READ_TIMEOUT
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
651 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
652
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
653 client:settimeout( 0 ) -- set non blocking
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
654 setmetatable(interface, interface_mt)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
655 interfacelist[ interface ] = true -- add to interfacelist
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
656 return interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
657 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
658
9897
a471d4cfec5e net/server_event: fix typo in comment
Maxime “pep” Buquet <pep@bouah.net>
parents: 9853
diff changeset
659 local function handleserver( server, addr, port, pattern, listener, sslctx, startssl ) -- creates a server interface
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
660 debug "creating server interface..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
661 local interface = {
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
662 _connections = 0;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
663
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
664 type = "server";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
665 conn = server;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
666 onconnect = listener.onconnect; -- will be called when new client connected
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
667 eventread = false; -- read event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
668 eventclose = false; -- close event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
669 readcallback = false; -- read event callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
670 fatalerror = false; -- error message
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
671 nointerface = true; -- lock/unlock parameter
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
672
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
673 _ip = addr, _port = port, _pattern = pattern,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
674 _sslctx = sslctx;
9850
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
675 hosts = {};
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
676 }
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
677 interface.id = tostring(interface):match("%x+$");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
678 interface.readcallback = function( event ) -- server handler, called on incoming connections
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
679 --vdebug( "server can accept, id/addr/port:", interface, addr, port )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
680 if interface.fatalerror then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
681 --vdebug( "leaving this event because:", self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
682 interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
683 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
684 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
685 local delay = cfg.ACCEPT_DELAY
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
686 if EV_TIMEOUT == event then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
687 if interface._connections >= cfg.MAX_CONNECTIONS then -- check connection count
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
688 debug( "to many connections, seconds to wait for next accept:", delay )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
689 return EV_TIMEOUT, delay -- timeout...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
690 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
691 return EV_READ -- accept again
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
692 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
693 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
694 --vdebug("max connection check ok, accepting...")
10547
c77471c180ea net.server_event: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 10407
diff changeset
695 -- luacheck: ignore 231/err
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
696 local client, err = server:accept() -- try to accept; TODO: check err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
697 while client do
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
698 if interface._connections >= cfg.MAX_CONNECTIONS then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
699 client:close( ) -- refuse connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
700 debug( "maximal connections reached, refuse client connection; accept delay:", delay )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
701 return EV_TIMEOUT, delay -- delay for next accept attempt
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
702 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
703 local client_ip, client_port = client:getpeername( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
704 interface._connections = interface._connections + 1 -- increase connection count
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
705 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
706 --vdebug( "client id:", clientinterface, "startssl:", startssl )
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
707 if has_luasec and startssl then
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
708 clientinterface:starttls(sslctx, true)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
709 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
710 clientinterface:_start_session( true )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
711 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
712 debug( "accepted incoming client connection from:", client_ip or "<unknown IP>", client_port or "<unknown port>", "to", port or "<unknown port>");
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
713
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
714 client, err = server:accept() -- try to accept again
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
715 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
716 return EV_READ
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
717 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
718
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
719 server:settimeout( 0 )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
720 setmetatable(interface, interface_mt)
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
721 interfacelist[ interface ] = true
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
722 interface:_start_session()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
723 return interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
724 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
725
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
726 local function listen(addr, port, listener, config)
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
727 config = config or {}
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
728 if config.sslctx and not has_luasec then
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
729 debug "fatal error: luasec not found"
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
730 return nil, "luasec not found"
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
731 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
732 local server, err = socket.bind( addr, port, cfg.ACCEPT_QUEUE ) -- create server socket
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
733 if not server then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
734 debug( "creating server socket on "..addr.." port "..port.." failed:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
735 return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
736 end
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
737 local interface = handleserver( server, addr, port, config.read_size, listener, config.tls_ctx, config.tls_direct) -- new server handler
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
738 debug( "new server created with id:", tostring(interface))
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
739 return interface
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
740 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
741
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
742 local function addserver( addr, port, listener, pattern, sslctx ) -- TODO: check arguments
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
743 --vdebug( "creating new tcp server with following parameters:", addr or "nil", port or "nil", sslctx or "nil", startssl or "nil")
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
744 return listen( addr, port, listener, {
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
745 read_size = pattern,
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
746 tls_ctx = sslctx,
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
747 tls_direct = not not sslctx,
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
748 });
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
749 end
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
750
10233
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
751 local function wrapclient( client, ip, port, listeners, pattern, sslctx, extra )
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
752 local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx, extra )
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
753 interface:_start_connection(sslctx)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
754 return interface, client
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
755 --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
756 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
757
10233
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
758 local function addclient( addr, serverport, listener, pattern, sslctx, typ, extra )
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
759 if sslctx and not has_luasec then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
760 debug "need luasec, but not available"
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
761 return nil, "luasec not found"
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
762 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
763 if not typ then
9473
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
764 local n = inet_pton(addr);
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
765 if not n then return nil, "invalid-ip"; end
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
766 if #n == 16 then
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
767 typ = "tcp6";
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
768 elseif #n == 4 then
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
769 typ = "tcp4";
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
770 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
771 end
9495
89e05b118f6e net.server: Remove socket constructor fallback
Kim Alvefur <zash@zash.se>
parents: 9473
diff changeset
772 local create = socket[typ];
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
773 if type( create ) ~= "function" then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
774 return nil, "invalid socket type"
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
775 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
776 local client, err = create() -- creating new socket
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
777 if not client then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
778 debug( "cannot create socket:", err )
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
779 return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
780 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
781 client:settimeout( 0 ) -- set nonblocking
9499
36e379f058c8 net.server: Swich method for connecting sockets with remotes
Kim Alvefur <zash@zash.se>
parents: 9495
diff changeset
782 local res, err = client:setpeername( addr, serverport ) -- connect
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
783 if res or ( err == "timeout" ) then
10547
c77471c180ea net.server_event: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 10407
diff changeset
784 -- luacheck: ignore 211/port
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
785 local ip, port = client:getsockname( )
10233
600eee3c4752 net.server: Accept and save an 'extra' field for client connections
Kim Alvefur <zash@zash.se>
parents: 9915
diff changeset
786 local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx, extra )
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
787 debug( "new connection id:", interface.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
788 return interface, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
789 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
790 debug( "new connection failed:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
791 return nil, err
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
792 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
793 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
794
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
795 local function loop( ) -- starts the event loop
2333
ed824115becf net.server_event: Return "quitting" on loop exit to be compatible with net.server_select, and give Prosody a way to know why the loop broke
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
796 base:loop( )
ed824115becf net.server_event: Return "quitting" on loop exit to be compatible with net.server_select, and give Prosody a way to know why the loop broke
Matthew Wild <mwild1@gmail.com>
parents: 2318
diff changeset
797 return "quitting";
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
798 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
799
6850
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
800 local function newevent( ... )
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
801 return addevent( base, ... )
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
802 end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
803
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
804 local function closeallservers ( arg )
6849
0455b9686e16 server_event: Replace implementation of ordered set with a simple table set
Kim Alvefur <zash@zash.se>
parents: 6819
diff changeset
805 for item in pairs( interfacelist ) do
2334
4cedfeeaaed4 net.server_event: Fix closeallservers() to work correctly after the giant refactorizification
Matthew Wild <mwild1@gmail.com>
parents: 2333
diff changeset
806 if item.type == "server" then
4cedfeeaaed4 net.server_event: Fix closeallservers() to work correctly after the giant refactorizification
Matthew Wild <mwild1@gmail.com>
parents: 2333
diff changeset
807 item:close( arg )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
808 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
809 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
810 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
811
2335
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
812 local function setquitting(yes)
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
813 if yes then
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
814 -- Quit now
8751
469f78fe1c3e net.server_event: Don't close servers if just quitting the loop once
Matthew Wild <mwild1@gmail.com>
parents: 8728
diff changeset
815 if yes ~= "once" then
469f78fe1c3e net.server_event: Don't close servers if just quitting the loop once
Matthew Wild <mwild1@gmail.com>
parents: 8728
diff changeset
816 closeallservers();
469f78fe1c3e net.server_event: Don't close servers if just quitting the loop once
Matthew Wild <mwild1@gmail.com>
parents: 8728
diff changeset
817 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
818 base:loopexit();
2335
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
819 end
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
820 end
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
821
4399
1b4161970842 net.server_event, net.server_select: Fixed some global pollution.
Waqas Hussain <waqas20@gmail.com>
parents: 4377
diff changeset
822 local function get_backend()
8314
1d2149d84c72 net.server_event: Add "libevent" to backend description
Kim Alvefur <zash@zash.se>
parents: 7810
diff changeset
823 return "libevent " .. base:method();
2340
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
824 end
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
825
2434
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
826 -- We need to hold onto the events to stop them
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
827 -- being garbage-collected
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
828 local signal_events = {}; -- [signal_num] -> event object
4399
1b4161970842 net.server_event, net.server_select: Fixed some global pollution.
Waqas Hussain <waqas20@gmail.com>
parents: 4377
diff changeset
829 local function hook_signal(signal_num, handler)
6856
489f4ae291bf server_event: Remove unused argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6855
diff changeset
830 local function _handler()
2434
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
831 local ret = handler();
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
832 if ret ~= false then -- Continue handling this signal?
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
833 return EV_SIGNAL; -- Yes
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
834 end
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
835 return -1; -- Close this event
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
836 end
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
837 signal_events[signal_num] = base:addevent(signal_num, EV_SIGNAL, _handler);
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
838 return signal_events[signal_num];
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
839 end
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
840
3003
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
841 local function link(sender, receiver, buffersize)
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
842 local sender_locked;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
843
3003
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
844 function receiver:ondrain()
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
845 if sender_locked then
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
846 sender:resume();
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
847 sender_locked = nil;
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
848 end
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
849 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
850
3003
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
851 function sender:onincoming(data)
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
852 receiver:write(data);
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
853 if receiver.writebufferlen >= buffersize then
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
854 sender_locked = true;
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
855 sender:pause();
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
856 end
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
857 end
6314
8029b8a5f37a net.server_select/event: Switch sender mode to *a when reading, to make sure we get all available data
Matthew Wild <mwild1@gmail.com>
parents: 6047
diff changeset
858 sender:set_mode("*a");
3003
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
859 end
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
860
6862
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
861 local function add_task(delay, callback)
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
862 local event_handle;
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
863 event_handle = base:addevent(nil, 0, function ()
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
864 local ret = callback(socket_gettime());
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
865 if ret then
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
866 return 0, ret;
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
867 elseif event_handle then
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
868 return -1;
6481
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
869 end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
870 end
6862
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
871 , delay);
6929
03bc9e197fcc net.server_event: Return event handle from add_task so it can be closed by eg util.timer
Kim Alvefur <zash@zash.se>
parents: 6862
diff changeset
872 return event_handle;
6481
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
873 end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
874
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
875 local function watchfd(fd, onreadable, onwriteable)
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
876 local handle = {};
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
877 function handle:setflags(r,w)
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
878 if r ~= nil then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
879 if r and not self.wantread then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
880 self.wantread = base:addevent(fd, EV_READ, function ()
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
881 onreadable(self);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
882 end);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
883 elseif not r and self.wantread then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
884 self.wantread:close();
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
885 self.wantread = nil;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
886 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
887 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
888 if w ~= nil then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
889 if w and not self.wantwrite then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
890 self.wantwrite = base:addevent(fd, EV_WRITE, function ()
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
891 onwriteable(self);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
892 end);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
893 elseif not r and self.wantread then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
894 self.wantwrite:close();
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
895 self.wantwrite = nil;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
896 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
897 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
898 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
899 handle:setflags(onreadable, onwriteable);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
900 return handle;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
901 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
902
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
903 return {
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
904 cfg = cfg,
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
905 base = base,
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
906 loop = loop,
3003
48871a549b4c net.server_select, net.server_event: Add server.link() to link 2 connections with an intermediate buffer of the specified size
Matthew Wild <mwild1@gmail.com>
parents: 3002
diff changeset
907 link = link,
6853
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
908 event = levent,
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
909 event_base = base,
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
910 addevent = newevent,
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
911 addserver = addserver,
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
912 listen = listen,
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
913 addclient = addclient,
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
914 wrapclient = wrapclient,
2336
fb1d9d2444df Rename closeallservers to closeall in the public API (same as net.server_select) and expose setquitting
Matthew Wild <mwild1@gmail.com>
parents: 2335
diff changeset
915 setquitting = setquitting,
fb1d9d2444df Rename closeallservers to closeall in the public API (same as net.server_select) and expose setquitting
Matthew Wild <mwild1@gmail.com>
parents: 2335
diff changeset
916 closeall = closeallservers,
2340
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
917 get_backend = get_backend,
2434
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
918 hook_signal = hook_signal,
6481
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
919 add_task = add_task,
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
920 watchfd = watchfd,
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
921
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
922 __NAME = SCRIPT_NAME,
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
923 __DATE = LAST_MODIFIED,
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
924 __AUTHOR = SCRIPT_AUTHOR,
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
925 __VERSION = SCRIPT_VERSION,
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
926
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
927 }