net/server_event.lua
author Kim Alvefur <zash@zash.se>
Thu, 04 Nov 2021 01:00:06 +0100
branch0.11
changeset 12093 76b4e3f12b53
parent 11067 30d3f6f85eb8
child 11072 988ddd57e851
permissions -rw-r--r--
mod_pep: Wipe pubsub service on user deletion Data is already wiped from storage, but this ensures everything is properly unsubscribed, possibly with notifications etc. Clears recipient cache as well, since it is no longer relevant.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
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
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
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
--]]
6855
626d8152b1ad server_event: Add luacheck annotations
Kim Alvefur <zash@zash.se>
parents: 6854
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
8986
23f66f04e216 net.server: Set default read timeout to 14 minutes (fixes #971)
Kim Alvefur <zash@zash.se>
parents: 8784
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)
7423
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: 7422
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
6853
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
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: 6852
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: 6852
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: 6852
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: 6852
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
6853
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
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
6853
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
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: 6852
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
6785
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" )
6853
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
    51
local socket = require "socket"
6856
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6855
diff changeset
    52
local levent = require "luaevent.core"
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
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: 9390
diff changeset
    54
local inet_pton = inet.pton;
6853
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
    55
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
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
6858
40236602ab5b server_event: Comment out the unused vdebug function [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6857
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
6856
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6855
diff changeset
    83
local base = levent.new( )
6853
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
    84
local addevent = base.addevent
6856
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6855
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: 6855
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: 6855
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: 6855
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
6852
0455b9686e16 server_event: Replace implementation of ordered set with a simple table set
Kim Alvefur <zash@zash.se>
parents: 6822
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
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
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
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
    97
-- Private methods
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
    98
function interface_mt:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
    99
	return self:_destroy();
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   100
end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
   101
7342
b5565715fce8 server_event: addclient: wrapclient already calls startconnection for us [backported from trunk]
daurnimator <quae@daurnimator.com>
parents: 7340
diff changeset
   102
function interface_mt:_start_connection(plainssl) -- called from wrapclient
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   103
	local callback = function( event )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   104
		if EV_TIMEOUT == event then  -- timeout during connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   105
			self.fatalerror = "connection timeout"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   106
			self:ontimeout()  -- call timeout listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   107
			self:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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: 7227
diff changeset
   109
		else
8533
075df839c110 net.server_event: Not every instantly-readable connection is an error, continue if possible
Matthew Wild <mwild1@gmail.com>
parents: 8532
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: 8532
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: 8532
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: 8532
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: 8532
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: 8532
diff changeset
   115
			end
6861
d8f8c0b2fda8 server_event: Normalize indentation
Kim Alvefur <zash@zash.se>
parents: 6859
diff changeset
   116
			if plainssl and has_luasec then  -- start ssl session
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   117
				self:starttls(self._sslctx, true)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   118
			else  -- normal connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   121
			debug( "new connection established. id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   122
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   123
		self.eventconnect = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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
8532
257fd322fc9f net.server_event: Better outgoing connection error handling
Matthew Wild <mwild1@gmail.com>
parents: 8387
diff changeset
   126
	self.eventconnect = addevent( base, self.conn, EV_READWRITE, callback, cfg.CONNECT_TIMEOUT )
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   127
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   128
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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: 7227
diff changeset
   130
	if self.type == "client" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   131
		local callback = function( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   132
			self:_lock( false,  false, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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: 7227
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: 7227
diff changeset
   135
			if call_onconnect then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   138
			self.eventsession = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   139
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   140
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   141
		self.eventsession = addevent( base, nil, EV_TIMEOUT, callback, 0 )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   142
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   143
		self:_lock( false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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: 7227
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
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   147
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   148
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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: 7227
diff changeset
   150
	--vdebug( "starting ssl session with client id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   151
	local _
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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: 7227
diff changeset
   153
	_ = self.eventwrite and self.eventwrite:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   154
	self.eventread, self.eventwrite = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   155
	local err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   156
	self.conn, err = ssl.wrap( self.conn, self._sslctx )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   157
	if err then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   158
		self.fatalerror = err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   159
		self.conn = nil  -- cannot be used anymore
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   160
		if call_onconnect then
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
   161
			self.ondisconnect = nil  -- don't call this when client isn't really connected
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   162
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   163
		self:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   164
		debug( "fatal error while ssl wrapping:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
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
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   167
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   168
	if self.conn.sni and self.servername then
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   169
		self.conn:sni(self.servername);
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   170
	end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   171
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   172
	self.conn:settimeout( 0 )  -- set non blocking
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   173
	local handshakecallback = coroutine_wrap(function( event )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   174
		local _, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   175
		local attempt = 0
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   176
		local maxattempt = cfg.MAX_HANDSHAKE_ATTEMPTS
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   177
		while attempt < maxattempt do  -- no endless loop
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   178
			attempt = attempt + 1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   179
			debug( "ssl handshake of client with id:"..tostring(self)..", attempt:"..attempt )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   180
			if attempt > maxattempt then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   181
				self.fatalerror = "max handshake attempts exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   182
			elseif EV_TIMEOUT == event then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   183
				self.fatalerror = "timeout during handshake"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   184
			else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   185
				_, err = self.conn:dohandshake( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   186
				if not err then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   187
					self:_lock( false, false, false )  -- unlock the interface; sending, closing etc allowed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   188
					self.send = self.conn.send  -- caching table lookups with new client object
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   189
					self.receive = self.conn.receive
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   190
					if not call_onconnect then  -- trigger listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   191
						self:onstatus("ssl-handshake-complete");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   192
					end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   193
					self:_start_session( call_onconnect )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   194
					debug( "ssl handshake done" )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   195
					self.eventhandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   196
					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
   197
				end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   198
				if err == "wantwrite" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   199
					event = EV_WRITE
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   200
				elseif err == "wantread" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   201
					event = EV_READ
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   202
				else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   203
					debug( "ssl handshake error:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   204
					self.fatalerror = err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   205
				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
   206
			end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   207
			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
   208
				if call_onconnect then
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
   209
					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
   210
				end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   211
				self:_close()
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   212
				debug( "handshake failed because:", self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   213
				self.eventhandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   214
				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
   215
			end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   216
			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
   217
		end
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
   218
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   219
	)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   220
	debug "starting handshake..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   221
	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: 7227
diff changeset
   222
	self.eventhandshake = addevent( base, self.conn, EV_READWRITE, handshakecallback, cfg.HANDSHAKE_TIMEOUT )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   223
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   224
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   225
function interface_mt:_destroy()  -- close this interface + events and call last listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   226
	debug( "closing client with id:", self.id, self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   227
	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: 7227
diff changeset
   228
	local _
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   229
	_ = self.eventread and self.eventread:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   230
	if self.type == "client" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   231
		_ = self.eventwrite and self.eventwrite:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   232
		_ = self.eventhandshake and self.eventhandshake:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   233
		_ = self.eventstarthandshake and self.eventstarthandshake:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   234
		_ = self.eventconnect and self.eventconnect:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   235
		_ = self.eventsession and self.eventsession:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   236
		_ = self.eventwritetimeout and self.eventwritetimeout:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   237
		_ = self.eventreadtimeout and self.eventreadtimeout:close( )
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
   238
		-- call ondisconnect listener (won't be the case if handshake failed on connect)
8387
4a5c6f6214ee net.server_event: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 8317
diff changeset
   239
		_ = self.ondisconnect and self:ondisconnect( self.fatalerror ~= "client to close" and self.fatalerror)
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   240
		_ = self.conn and self.conn:close( ) -- close connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   241
		_ = self._server and self._server:counter(-1);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   242
		self.eventread, self.eventwrite = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   243
		self.eventstarthandshake, self.eventhandshake, self.eventclose = nil, nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   244
		self.readcallback, self.writecallback = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   245
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   246
		self.conn:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   247
		self.eventread, self.eventclose = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   248
		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
   249
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   250
	interfacelist[ self ] = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   251
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   252
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
   253
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   254
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: 7227
diff changeset
   255
	self.nointerface, self.noreading, self.nowriting = nointerface, noreading, nowriting
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   256
	return nointerface, noreading, nowriting
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   257
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
   258
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   259
--TODO: Deprecate
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   260
function interface_mt:lock_read(switch)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   261
	if switch then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   262
		return self:pause();
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   263
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   264
		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
   265
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   266
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
   267
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   268
function interface_mt:pause()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   269
	return self:_lock(self.nointerface, true, self.nowriting);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   270
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   271
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   272
function interface_mt:resume()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   273
	self:_lock(self.nointerface, false, self.nowriting);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   274
	if self.readcallback and not self.eventread then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   275
		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: 7227
diff changeset
   276
		return true;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   277
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   278
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   279
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   280
function interface_mt:counter(c)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   281
	if c then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   282
		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
   283
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   284
	return self._connections
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   285
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   286
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   287
-- Public methods
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   288
function interface_mt:write(data)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   289
	if self.nowriting then return nil, "locked" end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   290
	--vdebug( "try to send data to client, id/data:", self.id, data )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   291
	data = tostring( data )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   292
	local len = #data
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   293
	local total = len + self.writebufferlen
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   294
	if total > cfg.MAX_SEND_LENGTH then  -- check buffer length
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   295
		local err = "send buffer exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   296
		debug( "error:", err )  -- to much, check your app
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   297
		return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   298
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   299
	t_insert(self.writebuffer, data) -- new buffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   300
	self.writebufferlen = total
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   301
	if not self.eventwrite then  -- register new write event
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   302
		--vdebug( "register new write event" )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   303
		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: 7227
diff changeset
   304
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   305
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   306
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   307
function interface_mt:close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   308
	if self.nointerface then return nil, "locked"; end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   309
	debug( "try to close client connection with id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   310
	if self.type == "client" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   311
		self.fatalerror = "client to close"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   312
		if self.eventwrite then -- wait for incomplete write request
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   313
			self:_lock( true, true, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   314
			debug "closing delayed until writebuffer is empty"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   315
			return nil, "writebuffer not empty, waiting"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   316
		else -- close now
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   317
			self:_lock( true, true, true )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   318
			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
   319
			return true
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
   320
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   321
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   322
		debug( "try to close server with id:", tostring(self.id))
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   323
		self.fatalerror = "server to close"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   324
		self:_lock( true )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   325
		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
   326
		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
   327
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   328
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   329
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   330
function interface_mt:socket()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   331
	return self.conn
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   332
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   333
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   334
function interface_mt:server()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   335
	return self._server or self;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   336
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   337
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   338
function interface_mt:port()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   339
	return self._port
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   340
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   341
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   342
function interface_mt:serverport()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   343
	return self._serverport
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   344
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   345
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   346
function interface_mt:ip()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   347
	return self._ip
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   348
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
   349
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   350
function interface_mt:ssl()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   351
	return self._usingssl
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   352
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   353
interface_mt.clientport = interface_mt.port -- COMPAT server_select
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   354
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   355
function interface_mt:type()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   356
	return self._type or "client"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   357
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   358
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   359
function interface_mt:connections()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   360
	return self._connections
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   361
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   362
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   363
function interface_mt:address()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   364
	return self.addr
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   365
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   366
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   367
function interface_mt:set_sslctx(sslctx)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   368
	self._sslctx = sslctx;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   369
	if sslctx then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   370
		self.starttls = nil; -- use starttls() of interface_mt
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   371
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   372
		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
   373
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   374
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
   375
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   376
function interface_mt:set_mode(pattern)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   377
	if pattern then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   378
		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
   379
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   380
	return self._pattern;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   381
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   382
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   383
function interface_mt:set_send(new_send) -- luacheck: ignore 212
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   384
	-- No-op, we always use the underlying connection's send
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   385
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
   386
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   387
function interface_mt:starttls(sslctx, call_onconnect)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   388
	debug( "try to start ssl at client id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   389
	local err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   390
	self._sslctx = sslctx;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   391
	if self._usingssl then  -- startssl was already called
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   392
		err = "ssl already active"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   393
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   394
	if err then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   395
		debug( "error:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   396
		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
   397
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   398
	self._usingssl = true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   399
	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: 7227
diff changeset
   400
		self.startsslcallback = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   401
		self:_start_ssl(call_onconnect);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   402
		self.eventstarthandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   403
		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
   404
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   405
	if not self.eventwrite then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   406
		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: 7227
diff changeset
   407
		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: 7227
diff changeset
   408
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   409
		-- wait until writebuffer is empty
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   410
		self:_lock( true, true, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   411
		debug "ssl session delayed until writebuffer is empty..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   412
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   413
	self.starttls = false;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   414
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   415
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
   416
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   417
function interface_mt:setoption(option, value)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   418
	if self.conn.setoption then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   419
		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
   420
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   421
	return false, "setoption not implemented";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   422
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   423
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   424
function interface_mt:setlistener(listener, data)
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   425
	self:ondetach(); -- Notify listener that it is no longer responsible for this connection
7340
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7339
diff changeset
   426
	self.onconnect = listener.onconnect;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7339
diff changeset
   427
	self.ondisconnect = listener.ondisconnect;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7339
diff changeset
   428
	self.onincoming = listener.onincoming;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7339
diff changeset
   429
	self.ontimeout = listener.ontimeout;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7339
diff changeset
   430
	self.onreadtimeout = listener.onreadtimeout;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7339
diff changeset
   431
	self.onstatus = listener.onstatus;
8ec935687bae server_event: Split long list of assignments into multiple lines for readability
Kim Alvefur <zash@zash.se>
parents: 7339
diff changeset
   432
	self.ondetach = listener.ondetach;
9388
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   433
	self.onattach = listener.onattach;
7812
34ca48325ce7 net.server_event: Also replace 'ondrain' when setting new listeners (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7691
diff changeset
   434
	self.ondrain = listener.ondrain;
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   435
	self:onattach(data);
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   436
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   437
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   438
-- Stub handlers
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   439
function interface_mt:onconnect()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   440
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   441
function interface_mt:onincoming()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   442
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   443
function interface_mt:ondisconnect()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   444
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   445
function interface_mt:ontimeout()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   446
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   447
function interface_mt:onreadtimeout()
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   448
	self.fatalerror = "timeout during receiving"
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   449
	debug( "connection failed:", self.fatalerror )
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   450
	self:_close()
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   451
	self.eventread = nil
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   452
end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   453
function interface_mt:ondrain()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   454
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   455
function interface_mt:ondetach()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   456
end
9388
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   457
function interface_mt:onattach()
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   458
end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   459
function interface_mt:onstatus()
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
   460
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
   461
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   462
-- 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
   463
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   464
local function handleclient( client, ip, port, server, pattern, listener, sslctx, extra )  -- creates an client interface
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   465
	--vdebug("creating client interfacce...")
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   466
	local interface = {
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   467
		type = "client";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   468
		conn = client;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   469
		currenttime = socket_gettime( );  -- safe the origin
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   470
		writebuffer = {};  -- writebuffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   471
		writebufferlen = 0;  -- length of writebuffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   472
		send = client.send;  -- caching table lookups
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   473
		receive = client.receive;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   474
		onconnect = listener.onconnect;  -- will be called when client disconnects
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   475
		ondisconnect = listener.ondisconnect;  -- will be called when client disconnects
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   476
		onincoming = listener.onincoming;  -- will be called when client sends data
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   477
		ontimeout = listener.ontimeout; -- called when fatal socket timeout occurs
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   478
		onreadtimeout = listener.onreadtimeout; -- called when socket inactivity timeout occurs
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   479
		ondrain = listener.ondrain; -- called when writebuffer is empty
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   480
		ondetach = listener.ondetach; -- called when disassociating this listener from this connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   481
		onstatus = listener.onstatus; -- called for status changes (e.g. of SSL/TLS)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   482
		eventread = false, eventwrite = false, eventclose = false,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   483
		eventhandshake = false, eventstarthandshake = false;  -- event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   484
		eventconnect = false, eventsession = false;  -- more event handler...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   485
		eventwritetimeout = false;  -- even more event handler...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   486
		eventreadtimeout = false;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   487
		fatalerror = false;  -- error message
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   488
		writecallback = false;  -- will be called on write events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   489
		readcallback = false;  -- will be called on read events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   490
		nointerface = true;  -- lock/unlock parameter of this interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   491
		noreading = false, nowriting = false;  -- locks of the read/writecallback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   492
		startsslcallback = false;  -- starting handshake callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   493
		position = false;  -- position of client in interfacelist
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
   494
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   495
		-- Properties
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   496
		_ip = ip, _port = port, _server = server, _pattern = pattern,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   497
		_serverport = (server and server:port() or nil),
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   498
		_sslctx = sslctx; -- parameters
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   499
		_usingssl = false;  -- client is using ssl;
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   500
		extra = extra;
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   501
		servername = extra and extra.servername;
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   502
	}
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   503
	if not has_luasec then interface.starttls = false; end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   504
	interface.id = tostring(interface):match("%x+$");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   505
	interface.writecallback = function( event )  -- called on write events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   506
		--vdebug( "new client write event, id/ip/port:", interface, ip, port )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   507
		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: 7227
diff changeset
   508
			--vdebug( "leaving this event because:", interface.nowriting or interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   509
			interface.eventwrite = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   510
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   511
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   512
		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: 7227
diff changeset
   513
			interface.fatalerror = "timeout during writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   514
			debug( "writing failed:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   515
			interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   516
			interface.eventwrite = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   517
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   518
		else  -- can write :)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   519
			if interface._usingssl then  -- handle luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   520
				if interface.eventreadtimeout then  -- we have to read first
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   521
					local ret = interface.readcallback( )  -- call readcallback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   522
					--vdebug( "tried to read in writecallback, result:", ret )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   523
				end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   524
				if interface.eventwritetimeout then  -- luasec only
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   525
					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: 7227
diff changeset
   526
					interface.eventwritetimeout = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   527
				end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   528
			end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   529
			interface.writebuffer = { t_concat(interface.writebuffer) }
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   530
			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: 7227
diff changeset
   531
			--vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte )
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
   532
			if succ then  -- writing successful
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   533
				interface.writebuffer[1] = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   534
				interface.writebufferlen = 0
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   535
				interface:ondrain();
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   536
				if interface.fatalerror then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   537
					debug "closing client after writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   538
					interface:_close()  -- close interface if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   539
				elseif interface.startsslcallback then  -- start ssl connection if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   540
					debug "starting ssl handshake after writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   541
					interface.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, interface.startsslcallback, 0 )
7402
066a4dfdac18 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7397 7401
diff changeset
   542
				elseif interface.writebufferlen ~= 0 then
7397
a700d54c620a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7388 7396
diff changeset
   543
					-- data possibly written from ondrain
a700d54c620a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7388 7396
diff changeset
   544
					return EV_WRITE, cfg.WRITE_TIMEOUT
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   545
				elseif interface.eventreadtimeout then
7388
17929cdacec2 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7342 7387
diff changeset
   546
					return EV_WRITE, cfg.WRITE_TIMEOUT
17929cdacec2 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7342 7387
diff changeset
   547
				end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   548
				interface.eventwrite = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   549
				return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   550
			elseif byte and (err == "timeout" or err == "wantwrite") then  -- want write again
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   551
				--vdebug( "writebuffer is not empty:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   552
				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: 7227
diff changeset
   553
				interface.writebufferlen = interface.writebufferlen - byte
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   554
				if "wantread" == err then  -- happens only with luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   555
					local callback = function( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   556
						interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   557
						interface.eventwritetimeout = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   558
						return -1;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   559
					end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   560
					interface.eventwritetimeout = addevent( base, nil, EV_TIMEOUT, callback, cfg.WRITE_TIMEOUT )  -- reg a new timeout event
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
   561
					debug( "wantread during write attempt, reg it in readcallback but don't know what really happens next..." )
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   562
					-- 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: 7227
diff changeset
   563
					return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   564
				end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   565
				return EV_WRITE, cfg.WRITE_TIMEOUT
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   566
			else  -- connection was closed during writing or fatal error
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   567
				interface.fatalerror = err or "fatal error"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   568
				debug( "connection failed in write event:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   569
				interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   570
				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
   571
				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
   572
			end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   573
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   574
	end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   575
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   576
	interface.readcallback = function( event )  -- called on read events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   577
		--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: 7227
diff changeset
   578
		if interface.noreading or interface.fatalerror then  -- leave this event
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   579
			--vdebug( "leaving this event because:", tostring(interface.noreading or interface.fatalerror) )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   580
			interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   581
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   582
		end
7423
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: 7422
diff changeset
   583
		if EV_TIMEOUT == event and not interface.conn:dirty() and interface:onreadtimeout() ~= true then
7691
88ad2d5bcf80 net.server_event: Restore destruction of socket on read timeout (lost since e67891ad18d6) (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7423
diff changeset
   584
			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: 7423
diff changeset
   585
			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: 7423
diff changeset
   586
			interface:_close()
88ad2d5bcf80 net.server_event: Restore destruction of socket on read timeout (lost since e67891ad18d6) (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7423
diff changeset
   587
			interface.eventread = nil
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   588
			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: 6853
diff changeset
   589
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   590
		if interface._usingssl then  -- handle luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   591
			if interface.eventwritetimeout then  -- ok, in the past writecallback was regged
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   592
				local ret = interface.writecallback( )  -- call it
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   593
				--vdebug( "tried to write in readcallback, result:", tostring(ret) )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   594
			end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   595
			if interface.eventreadtimeout then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   596
				interface.eventreadtimeout:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   597
				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
   598
			end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   599
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   600
		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: 7227
diff changeset
   601
		--vdebug( "read data:", tostring(buffer), "error:", tostring(err), "part:", tostring(part) )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   602
		buffer = buffer or part
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   603
		if buffer and #buffer > cfg.MAX_READ_LENGTH then  -- check buffer length
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   604
			interface.fatalerror = "receive buffer exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   605
			debug( "fatal error:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   606
			interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   607
			interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   608
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   609
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   610
		if err and ( err ~= "timeout" and err ~= "wantread" ) then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   611
			if "wantwrite" == err then -- need to read on write event
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   612
				if not interface.eventwrite then  -- register new write event if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   613
					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
   614
				end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   615
				interface.eventreadtimeout = addevent( base, nil, EV_TIMEOUT,
7422
325c03f5481b net.server_event: Collect entire one line function on one line
Kim Alvefur <zash@zash.se>
parents: 7402
diff changeset
   616
					function( ) interface:_close() end, cfg.READ_TIMEOUT)
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
   617
				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: 8533
diff changeset
   618
				-- to be honest i don't know what happens next, if it is allowed to first read, the write etc...
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   619
			else  -- connection was closed or fatal error
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   620
				interface.fatalerror = err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   621
				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
   622
				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
   623
				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
   624
				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
   625
			end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   626
		else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   627
			interface.onincoming( interface, buffer, err )  -- send new data to listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   628
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   629
		if interface.noreading then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   630
			interface.eventread = nil;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   631
			return -1;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   632
		end
7423
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: 7422
diff changeset
   633
		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: 7422
diff changeset
   634
			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: 7422
diff changeset
   635
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   636
		return EV_READ, cfg.READ_TIMEOUT
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   637
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   638
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   639
	client:settimeout( 0 )  -- set non blocking
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   640
	setmetatable(interface, interface_mt)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   641
	interfacelist[ interface ] = true  -- add to interfacelist
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   642
	return interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   643
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   644
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   645
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: 7227
diff changeset
   646
	debug "creating server interface..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   647
	local interface = {
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   648
		_connections = 0;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   649
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   650
		type = "server";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   651
		conn = server;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   652
		onconnect = listener.onconnect;  -- will be called when new client connected
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   653
		eventread = false;  -- read event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   654
		eventclose = false; -- close event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   655
		readcallback = false; -- read event callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   656
		fatalerror = false; -- error message
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   657
		nointerface = true;  -- lock/unlock parameter
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   658
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   659
		_ip = addr, _port = port, _pattern = pattern,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   660
		_sslctx = sslctx;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   661
	}
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   662
	interface.id = tostring(interface):match("%x+$");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   663
	interface.readcallback = function( event )  -- server handler, called on incoming connections
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   664
		--vdebug( "server can accept, id/addr/port:", interface, addr, port )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   665
		if interface.fatalerror then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   666
			--vdebug( "leaving this event because:", self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   667
			interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   668
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   669
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   670
		local delay = cfg.ACCEPT_DELAY
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   671
		if EV_TIMEOUT == event then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   672
			if interface._connections >= cfg.MAX_CONNECTIONS then  -- check connection count
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   673
				debug( "to many connections, seconds to wait for next accept:", delay )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   674
				return EV_TIMEOUT, delay  -- timeout...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   675
			else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   676
				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
   677
			end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   678
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   679
		--vdebug("max connection check ok, accepting...")
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   680
		local client, err = server:accept()    -- try to accept; TODO: check err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   681
		while client do
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   682
			if interface._connections >= cfg.MAX_CONNECTIONS then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   683
				client:close( )  -- refuse connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   684
				debug( "maximal connections reached, refuse client connection; accept delay:", delay )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   685
				return EV_TIMEOUT, delay  -- delay for next accept attempt
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   686
			end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   687
			local client_ip, client_port = client:getpeername( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   688
			interface._connections = interface._connections + 1  -- increase connection count
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   689
			local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   690
			--vdebug( "client id:", clientinterface, "startssl:", startssl )
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   691
			if has_luasec and sslctx then
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   692
				clientinterface:starttls(sslctx, true)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   693
			else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   694
				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
   695
			end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   696
			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
   697
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   698
			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
   699
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   700
		return EV_READ
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   701
	end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   702
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   703
	server:settimeout( 0 )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   704
	setmetatable(interface, interface_mt)
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   705
	interfacelist[ interface ] = true
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   706
	interface:_start_session()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   707
	return interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   708
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   709
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   710
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: 6853
diff changeset
   711
	--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: 6853
diff changeset
   712
	if sslctx and not has_luasec then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   713
		debug "fatal error: luasec not found"
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   714
		return nil, "luasec not found"
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   715
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   716
	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: 7227
diff changeset
   717
	if not server then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   718
		debug( "creating server socket on "..addr.." port "..port.." failed:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   719
		return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   720
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   721
	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: 7227
diff changeset
   722
	debug( "new server created with id:", tostring(interface))
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   723
	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
   724
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   725
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   726
local function wrapclient( client, ip, port, listeners, pattern, sslctx, extra )
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   727
	local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx, extra )
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   728
	interface:_start_connection(sslctx)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   729
	return interface, client
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   730
	--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: 7227
diff changeset
   731
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   732
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   733
local function addclient( addr, serverport, listener, pattern, sslctx, typ, extra )
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   734
	if sslctx and not has_luasec then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   735
		debug "need luasec, but not available"
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   736
		return nil, "luasec not found"
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   737
	end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   738
	if not typ then
9476
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   739
		local n = inet_pton(addr);
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   740
		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: 9390
diff changeset
   741
		if #n == 16 then
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   742
			typ = "tcp6";
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   743
		elseif #n == 4 then
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   744
			typ = "tcp4";
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   745
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   746
	end
9498
89e05b118f6e net.server: Remove socket constructor fallback
Kim Alvefur <zash@zash.se>
parents: 9476
diff changeset
   747
	local create = socket[typ];
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   748
	if type( create ) ~= "function"  then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   749
		return nil, "invalid socket type"
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   750
	end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   751
	local client, err = create()  -- creating new socket
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   752
	if not client then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   753
		debug( "cannot create socket:", err )
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   754
		return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   755
	end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   756
	client:settimeout( 0 )  -- set nonblocking
9502
36e379f058c8 net.server: Swich method for connecting sockets with remotes
Kim Alvefur <zash@zash.se>
parents: 9498
diff changeset
   757
	local res, err = client:setpeername( addr, serverport )  -- connect
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   758
	if res or ( err == "timeout" ) then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   759
		local ip, port = client:getsockname( )
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   760
		local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx, extra )
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   761
		debug( "new connection id:", interface.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   762
		return interface, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   763
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   764
		debug( "new connection failed:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   765
		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
   766
	end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   767
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   768
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   769
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
   770
	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
   771
	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
   772
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   773
6853
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
   774
local function newevent( ... )
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
   775
	return addevent( base, ... )
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   776
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
   777
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   778
local function closeallservers ( arg )
6852
0455b9686e16 server_event: Replace implementation of ordered set with a simple table set
Kim Alvefur <zash@zash.se>
parents: 6822
diff changeset
   779
	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
   780
		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
   781
			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
   782
		end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   783
	end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   784
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   785
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
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
   787
	if yes then
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   788
		-- Quit now
8754
469f78fe1c3e net.server_event: Don't close servers if just quitting the loop once
Matthew Wild <mwild1@gmail.com>
parents: 8731
diff changeset
   789
		if yes ~= "once" then
469f78fe1c3e net.server_event: Don't close servers if just quitting the loop once
Matthew Wild <mwild1@gmail.com>
parents: 8731
diff changeset
   790
			closeallservers();
469f78fe1c3e net.server_event: Don't close servers if just quitting the loop once
Matthew Wild <mwild1@gmail.com>
parents: 8731
diff changeset
   791
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   792
		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
   793
	end
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
   794
end
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
   795
4399
1b4161970842 net.server_event, net.server_select: Fixed some global pollution.
Waqas Hussain <waqas20@gmail.com>
parents: 4377
diff changeset
   796
local function get_backend()
8317
1d2149d84c72 net.server_event: Add "libevent" to backend description
Kim Alvefur <zash@zash.se>
parents: 7813
diff changeset
   797
	return "libevent " .. base:method();
2340
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
   798
end
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
   799
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
   800
-- 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
   801
-- 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
   802
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
   803
local function hook_signal(signal_num, handler)
6859
489f4ae291bf server_event: Remove unused argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6858
diff changeset
   804
	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
   805
		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
   806
		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
   807
			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
   808
		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
   809
		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
   810
	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
   811
	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
   812
	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
   813
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
   814
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
   815
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
   816
	local sender_locked;
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 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
   819
		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
   820
			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
   821
			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
   822
		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
   823
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
   824
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
   825
	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
   826
		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
   827
		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
   828
			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
   829
			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
   830
		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
   831
	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
   832
	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
   833
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
   834
6865
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   835
local function add_task(delay, callback)
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   836
	local event_handle;
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   837
	event_handle = base:addevent(nil, 0, function ()
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   838
		local ret = callback(socket_gettime());
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   839
		if ret then
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   840
			return 0, ret;
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   841
		elseif event_handle then
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   842
			return -1;
6484
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
   843
		end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
   844
	end
6865
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   845
	, delay);
6932
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: 6865
diff changeset
   846
	return event_handle;
6484
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
   847
end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
   848
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   849
local function watchfd(fd, onreadable, onwriteable)
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   850
	local handle = {};
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   851
	function handle:setflags(r,w)
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   852
		if r ~= nil then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   853
			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: 8754
diff changeset
   854
				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: 8754
diff changeset
   855
					onreadable(self);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   856
				end);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   857
			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: 8754
diff changeset
   858
				self.wantread:close();
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   859
				self.wantread = nil;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   860
			end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   861
		end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   862
		if w ~= nil then
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   863
			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: 8754
diff changeset
   864
				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: 8754
diff changeset
   865
					onwriteable(self);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   866
				end);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   867
			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: 8754
diff changeset
   868
				self.wantwrite:close();
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   869
				self.wantwrite = nil;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   870
			end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   871
		end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   872
	end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   873
	handle:setflags(onreadable, onwriteable);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   874
	return handle;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   875
end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   876
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   877
return {
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   878
	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
   879
	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
   880
	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
   881
	link = link,
6856
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6855
diff changeset
   882
	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
   883
	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
   884
	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
   885
	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
   886
	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
   887
	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
   888
	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
   889
	closeall = closeallservers,
2340
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
   890
	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
   891
	hook_signal = hook_signal,
6484
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
   892
	add_task = add_task,
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   893
	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
   894
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   895
	__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
   896
	__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
   897
	__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
   898
	__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
   899
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   900
}