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