Annotate

net/server_event.lua @ 12480:7e9ebdc75ce4

net: isolate LuaSec-specifics For this, various accessor functions are now provided directly on the sockets, which reach down into the LuaSec implementation to obtain the information. While this may seem of little gain at first, it hides the implementation detail of the LuaSec+LuaSocket combination that the actual socket and the TLS layer are separate objects. The net gain here is that an alternative implementation does not have to emulate that specific implementation detail and "only" has to expose LuaSec-compatible data structures on the new functions.
author Jonas Schäfer <jonas@wielicki.name>
date Wed, 27 Apr 2022 17:44:14 +0200
parent 12387:05c250fa335a
child 12481:2ee27587fec7
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
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
50 local has_luasec = 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
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
156 self.conn, err = self._sslctx:wrap(self.conn)
7336
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
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
167
9850
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);
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
171 elseif next(self._sslctx._sni_contexts) ~= nil then
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
172 self.conn:sni(self._sslctx._sni_contexts, true);
9850
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
173 end
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
174 end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
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)
12387
05c250fa335a Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents: 11741
diff changeset
265 log("warn", ":lock_read is deprecated, use :pause() 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
12480
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
277 function interface_mt:sslctx()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
278 return self._sslctx
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
279 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
280
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
281 function interface_mt:ssl_info()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
282 return self.conn.info and self.conn:info()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
283 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
284
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
285 function interface_mt:ssl_peercertificate()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
286 return self.conn.getpeercertificate and self.conn:getpeercertificate()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
287 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
288
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
289 function interface_mt:ssl_peerverification()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
290 return self.conn.getpeerverification and self.conn:getpeerverification()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
291 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
292
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
293 function interface_mt:ssl_peerfinished()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
294 return self.conn.getpeerfinished and self.conn:getpeerfinished()
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
295 end
7e9ebdc75ce4 net: isolate LuaSec-specifics
Jonas Schäfer <jonas@wielicki.name>
parents: 12387
diff changeset
296
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
297 function interface_mt:resume()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
298 self:_lock(self.nointerface, false, self.nowriting);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
299 if self.readcallback and not self.eventread then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
300 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
301 return true;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
302 end
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
9581
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
305 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
306 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
307 end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
308
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
309 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
310 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
311 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
312 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
313 return true;
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
314 end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
315 end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
316
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9575
diff changeset
317
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
318 function interface_mt:counter(c)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
319 if c then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
320 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
321 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
322 return self._connections
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
323 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
324
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
325 -- Public methods
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
326 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
327 if self.nointerface then return nil, "locked"; end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
328 --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
329 data = tostring( data )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
330 local len = #data
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
331 local total = len + self.writebufferlen
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
332 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
333 local err = "send buffer exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
334 debug( "error:", err ) -- to much, check your app
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
335 return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
336 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
337 t_insert(self.writebuffer, data) -- new buffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
338 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
339 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
340 --vdebug( "register new write event" )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
341 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
342 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
343 return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
344 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
345 function interface_mt:close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
346 if self.nointerface then return nil, "locked"; end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
347 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
348 if self.type == "client" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
349 self.fatalerror = "client to close"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
350 if self.eventwrite then -- wait for incomplete write request
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
351 self:_lock( true, true, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
352 debug "closing delayed until writebuffer is empty"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
353 return nil, "writebuffer not empty, waiting"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
354 else -- close now
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
355 self:_lock( true, true, true )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
356 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
357 return true
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
358 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
359 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
360 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
361 self.fatalerror = "server to close"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
362 self:_lock( true )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
363 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
364 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
365 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
366 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
367
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
368 function interface_mt:socket()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
369 return self.conn
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
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
372 function interface_mt:server()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
373 return self._server or self;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
374 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
375
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
376 function interface_mt:port()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
377 return self._port
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
378 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
379
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
380 function interface_mt:serverport()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
381 return self._serverport
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
382 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
383
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
384 function interface_mt:ip()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
385 return self._ip
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
386 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
387
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
388 function interface_mt:ssl()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
389 return self._usingssl
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
390 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
391 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
392
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
393 function interface_mt:type()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
394 return self._type or "client"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
395 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
396
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
397 function interface_mt:connections()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
398 return self._connections
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
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
401 function interface_mt:address()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
402 return self.addr
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
403 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
404
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
405 function interface_mt:set_sslctx(sslctx)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
406 self._sslctx = sslctx;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
407 if sslctx then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
408 self.starttls = nil; -- use starttls() of interface_mt
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
409 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
410 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
411 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
412 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
413
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
414 function interface_mt:set_mode(pattern)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
415 if pattern then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
416 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
417 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
418 return self._pattern;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
419 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
420
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
421 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
422 -- 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
423 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
424
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
425 function interface_mt:starttls(sslctx, call_onconnect)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
426 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
427 local err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
428 self._sslctx = sslctx;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
429 if self._usingssl then -- startssl was already called
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
430 err = "ssl already active"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
431 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
432 if err then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
433 debug( "error:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
434 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
435 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
436 self._usingssl = true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
437 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
438 self.startsslcallback = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
439 self:_start_ssl(call_onconnect);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
440 self.eventstarthandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
441 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
442 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
443 if not self.eventwrite then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
444 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
445 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
446 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
447 -- wait until writebuffer is empty
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
448 self:_lock( true, true, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
449 debug "ssl session delayed until writebuffer is empty..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
450 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
451 self.starttls = false;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
452 return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
453 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
454
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
455 function interface_mt:setoption(option, value)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
456 if self.conn.setoption then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
457 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
458 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
459 return false, "setoption not implemented";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
460 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
461
9387
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
462 function interface_mt:setlistener(listener, data)
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
463 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
464 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
465 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
466 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
467 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
468 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
469 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
470 self.ondetach = listener.ondetach;
9385
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
471 self.onattach = listener.onattach;
11741
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11068
diff changeset
472 self.onpredrain = listener.onpredrain;
7809
34ca48325ce7 net.server_event: Also replace 'ondrain' when setting new listeners (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7688
diff changeset
473 self.ondrain = listener.ondrain;
9387
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9385
diff changeset
474 self:onattach(data);
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
475 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
476
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
477 -- Stub handlers
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
478 function interface_mt:onconnect()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
479 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
480 function interface_mt:onincoming()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
481 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
482 function interface_mt:ondisconnect()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
483 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
484 function interface_mt:ontimeout()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
485 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
486 function interface_mt:onreadtimeout()
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
487 end
11741
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11068
diff changeset
488 function interface_mt:onpredrain()
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11068
diff changeset
489 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
490 function interface_mt:ondrain()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
491 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
492 function interface_mt:ondetach()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
493 end
9385
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
494 function interface_mt:onattach()
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8983
diff changeset
495 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
496 function interface_mt:onstatus()
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
497 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
498
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
499 -- 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
500
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
501 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
502 --vdebug("creating client interfacce...")
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
503 local interface = {
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
504 type = "client";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
505 conn = client;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
506 currenttime = socket_gettime( ); -- safe the origin
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
507 writebuffer = {}; -- writebuffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
508 writebufferlen = 0; -- length of writebuffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
509 send = client.send; -- caching table lookups
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
510 receive = client.receive;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
511 onconnect = listener.onconnect; -- will be called when client disconnects
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
512 ondisconnect = listener.ondisconnect; -- will be called when client disconnects
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
513 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
514 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
515 onreadtimeout = listener.onreadtimeout; -- called when socket inactivity timeout occurs
11741
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11068
diff changeset
516 onpredrain = listener.onpredrain; -- called before writes
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
517 ondrain = listener.ondrain; -- called when writebuffer is empty
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
518 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
519 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
520 eventread = false, eventwrite = false, eventclose = false,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
521 eventhandshake = false, eventstarthandshake = false; -- event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
522 eventconnect = false, eventsession = false; -- more event handler...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
523 eventwritetimeout = false; -- even more event handler...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
524 eventreadtimeout = false;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
525 fatalerror = false; -- error message
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
526 writecallback = false; -- will be called on write events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
527 readcallback = false; -- will be called on read events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
528 nointerface = true; -- lock/unlock parameter of this interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
529 noreading = false, nowriting = false; -- locks of the read/writecallback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
530 startsslcallback = false; -- starting handshake callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
531 position = false; -- position of client in interfacelist
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
532
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
533 -- Properties
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
534 _ip = ip, _port = port, _server = server, _pattern = pattern,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
535 _serverport = (server and server:port() or nil),
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
536 _sslctx = sslctx; -- parameters
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
537 _usingssl = false; -- client is using ssl;
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
538 extra = extra;
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
539 servername = extra and extra.servername;
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
540 }
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
541 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
542 interface.id = tostring(interface):match("%x+$");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
543 interface.writecallback = function( event ) -- called on write events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
544 --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
545 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
546 --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
547 interface.eventwrite = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
548 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
549 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
550 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
551 interface.fatalerror = "timeout during writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
552 debug( "writing failed:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
553 interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
554 interface.eventwrite = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
555 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
556 else -- can write :)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
557 if interface._usingssl then -- handle luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
558 if interface.eventreadtimeout then -- we have to read first
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
559 local ret = interface.readcallback( ) -- call readcallback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
560 --vdebug( "tried to read in writecallback, result:", ret )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
561 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
562 if interface.eventwritetimeout then -- luasec only
12387
05c250fa335a Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents: 11741
diff changeset
563 interface.eventwritetimeout:close( ) -- first we have to close timeout event which where registered after a wantread error
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
564 interface.eventwritetimeout = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
565 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
566 end
11741
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11068
diff changeset
567 interface:onpredrain();
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
568 interface.writebuffer = { t_concat(interface.writebuffer) }
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
569 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
570 --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
571 if succ then -- writing successful
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
572 interface.writebuffer[1] = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
573 interface.writebufferlen = 0
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
574 interface:ondrain();
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
575 if interface.fatalerror then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
576 debug "closing client after writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
577 interface:_close() -- close interface if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
578 elseif interface.startsslcallback then -- start ssl connection if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
579 debug "starting ssl handshake after writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
580 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
581 elseif interface.writebufferlen ~= 0 then
7394
a700d54c620a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7385 7393
diff changeset
582 -- data possibly written from ondrain
a700d54c620a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7385 7393
diff changeset
583 return EV_WRITE, cfg.WRITE_TIMEOUT
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
584 elseif interface.eventreadtimeout then
7385
17929cdacec2 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7339 7384
diff changeset
585 return EV_WRITE, cfg.WRITE_TIMEOUT
17929cdacec2 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7339 7384
diff changeset
586 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
587 interface.eventwrite = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
588 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
589 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
590 --vdebug( "writebuffer is not empty:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
591 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
592 interface.writebufferlen = interface.writebufferlen - byte
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
593 if "wantread" == err then -- happens only with luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
594 local callback = function( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
595 interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
596 interface.eventwritetimeout = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
597 return -1;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
598 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
599 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
600 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
601 -- 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
602 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
603 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
604 return EV_WRITE, cfg.WRITE_TIMEOUT
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
605 else -- connection was closed during writing or fatal error
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
606 interface.fatalerror = err or "fatal error"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
607 debug( "connection failed in write event:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
608 interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
609 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
610 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
611 end
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
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
613 end
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
614
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
615 interface.readcallback = function( event ) -- called on read events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
616 --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
617 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
618 --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
619 interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
620 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
621 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
622 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
623 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
624 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
625 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
626 interface.eventread = nil
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
627 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
628 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
629 if interface._usingssl then -- handle luasec
12387
05c250fa335a Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents: 11741
diff changeset
630 if interface.eventwritetimeout then -- ok, in the past writecallback was registered
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
631 local ret = interface.writecallback( ) -- call it
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
632 --vdebug( "tried to write in readcallback, result:", tostring(ret) )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
633 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
634 if interface.eventreadtimeout then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
635 interface.eventreadtimeout:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
636 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
637 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
638 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
639 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
640 --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
641 buffer = buffer or part
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
642 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
643 interface.fatalerror = "receive buffer exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
644 debug( "fatal error:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
645 interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
646 interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
647 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
648 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
649 if err and ( err ~= "timeout" and err ~= "wantread" ) then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
650 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
651 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
652 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
653 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
654 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
655 function( ) interface:_close() end, cfg.READ_TIMEOUT)
8728
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8530
diff changeset
656 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
657 -- 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
658 else -- connection was closed or fatal error
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
659 interface.fatalerror = err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
660 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
661 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
662 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
663 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
664 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
665 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
666 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
667 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
668 if interface.noreading then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
669 interface.eventread = nil;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
670 return -1;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
671 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
672 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
673 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
674 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
675 return EV_READ, cfg.READ_TIMEOUT
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
676 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
677
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
678 client:settimeout( 0 ) -- set non blocking
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
679 setmetatable(interface, interface_mt)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
680 interfacelist[ interface ] = true -- add to interfacelist
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
681 return interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
682 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
683
9897
a471d4cfec5e net/server_event: fix typo in comment
Maxime “pep” Buquet <pep@bouah.net>
parents: 9853
diff changeset
684 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
685 debug "creating server interface..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
686 local interface = {
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
687 _connections = 0;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
688
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
689 type = "server";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
690 conn = server;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
691 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
692 eventread = false; -- read event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
693 eventclose = false; -- close event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
694 readcallback = false; -- read event callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
695 fatalerror = false; -- error message
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
696 nointerface = true; -- lock/unlock parameter
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
697
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
698 _ip = addr, _port = port, _pattern = pattern,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
699 _sslctx = sslctx;
9850
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9835
diff changeset
700 hosts = {};
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
701 }
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
702 interface.id = tostring(interface):match("%x+$");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
703 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
704 --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
705 if interface.fatalerror then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
706 --vdebug( "leaving this event because:", self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
707 interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
708 return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
709 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
710 local delay = cfg.ACCEPT_DELAY
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
711 if EV_TIMEOUT == event then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
712 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
713 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
714 return EV_TIMEOUT, delay -- timeout...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
715 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
716 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
717 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
718 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
719 --vdebug("max connection check ok, accepting...")
10547
c77471c180ea net.server_event: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 10407
diff changeset
720 -- luacheck: ignore 231/err
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
721 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
722 while client do
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
723 if interface._connections >= cfg.MAX_CONNECTIONS then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
724 client:close( ) -- refuse connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
725 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
726 return EV_TIMEOUT, delay -- delay for next accept attempt
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
727 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
728 local client_ip, client_port = client:getpeername( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
729 interface._connections = interface._connections + 1 -- increase connection count
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
730 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
731 --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
732 if has_luasec and startssl then
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
733 clientinterface:starttls(sslctx, true)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
734 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
735 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
736 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
737 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
738
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
739 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
740 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
741 return EV_READ
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
742 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
743
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
744 server:settimeout( 0 )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
745 setmetatable(interface, interface_mt)
7224
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7040 7223
diff changeset
746 interfacelist[ interface ] = true
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
747 interface:_start_session()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
748 return interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
749 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
750
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
751 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
752 config = config or {}
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
753 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
754 debug "fatal error: luasec not found"
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
755 return nil, "luasec not found"
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
756 end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
757 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
758 if not server then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
759 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
760 return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
761 end
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
762 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
763 debug( "new server created with id:", tostring(interface))
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
764 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
765 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
766
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
767 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
768 --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
769 return listen( addr, port, listener, {
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
770 read_size = pattern,
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
771 tls_ctx = sslctx,
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
772 tls_direct = not not sslctx,
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
773 });
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
774 end
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
775
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
776 local function wrapclient( client, ip, port, listeners, pattern, sslctx, extra )
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
777 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
778 interface:_start_connection(sslctx)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
779 return interface, client
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
780 --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
781 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
782
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
783 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
784 if sslctx and not has_luasec then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
785 debug "need luasec, but not available"
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
786 return nil, "luasec not found"
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
787 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
788 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
789 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
790 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
791 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
792 typ = "tcp6";
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9387
diff changeset
793 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
794 typ = "tcp4";
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
795 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
796 end
9495
89e05b118f6e net.server: Remove socket constructor fallback
Kim Alvefur <zash@zash.se>
parents: 9473
diff changeset
797 local create = socket[typ];
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
798 if type( create ) ~= "function" then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
799 return nil, "invalid socket type"
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
800 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
801 local client, err = create() -- creating new socket
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
802 if not client then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
803 debug( "cannot create socket:", err )
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
804 return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
805 end
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
806 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
807 local res, err = client:setpeername( addr, serverport ) -- connect
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
808 if res or ( err == "timeout" ) then
10547
c77471c180ea net.server_event: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 10407
diff changeset
809 -- luacheck: ignore 211/port
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
810 local ip, port = client:getsockname( )
11063
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9499
diff changeset
811 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
812 debug( "new connection id:", interface.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
813 return interface, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
814 else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
815 debug( "new connection failed:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
816 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
817 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
818 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
819
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
820 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
821 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
822 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
823 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
824
6850
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6849
diff changeset
825 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
826 return addevent( base, ... )
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
827 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
828
6851
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6850
diff changeset
829 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
830 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
831 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
832 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
833 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
834 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
835 end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
836
2335
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
837 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
838 if yes then
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
839 -- 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
840 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
841 closeallservers();
469f78fe1c3e net.server_event: Don't close servers if just quitting the loop once
Matthew Wild <mwild1@gmail.com>
parents: 8728
diff changeset
842 end
7336
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7224
diff changeset
843 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
844 end
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
845 end
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
846
4399
1b4161970842 net.server_event, net.server_select: Fixed some global pollution.
Waqas Hussain <waqas20@gmail.com>
parents: 4377
diff changeset
847 local function get_backend()
8314
1d2149d84c72 net.server_event: Add "libevent" to backend description
Kim Alvefur <zash@zash.se>
parents: 7810
diff changeset
848 return "libevent " .. base:method();
2340
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
849 end
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
850
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
851 -- 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
852 -- 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
853 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
854 local function hook_signal(signal_num, handler)
6856
489f4ae291bf server_event: Remove unused argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6855
diff changeset
855 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
856 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
857 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
858 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
859 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
860 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
861 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
862 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
863 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
864 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
865
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
866 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
867 local sender_locked;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
868
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
869 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
870 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
871 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
872 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
873 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
874 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
875
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
876 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
877 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
878 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
879 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
880 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
881 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
882 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
883 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
884 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
885
6862
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
886 local function add_task(delay, callback)
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
887 local event_handle;
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
888 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
889 local ret = callback(socket_gettime());
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
890 if ret then
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
891 return 0, ret;
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
892 elseif event_handle then
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
893 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
894 end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
895 end
6862
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6861
diff changeset
896 , 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
897 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
898 end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
899
8781
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
900 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
901 local handle = {};
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
902 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
903 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
904 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
905 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
906 onreadable(self);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
907 end);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
908 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
909 self.wantread:close();
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
910 self.wantread = nil;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
911 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
912 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
913 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
914 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
915 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
916 onwriteable(self);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
917 end);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
918 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
919 self.wantwrite:close();
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
920 self.wantwrite = nil;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
921 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
922 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
923 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
924 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
925 return handle;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
926 end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8751
diff changeset
927
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
928 return {
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
929 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
930 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
931 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
932 link = link,
6853
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
933 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
934 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
935 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
936 addserver = addserver,
9835
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9581
diff changeset
937 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
938 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
939 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
940 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
941 closeall = closeallservers,
2340
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
942 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
943 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
944 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
945 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
946
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
947 __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
948 __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
949 __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
950 __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
951
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
952 }