net/server_event.lua
author Kim Alvefur <zash@zash.se>
Mon, 16 Aug 2021 12:34:52 +0200
changeset 11745 dcf38ac6a38c
parent 11072 988ddd57e851
child 12391 05c250fa335a
permissions -rw-r--r--
net.server: Add a predrain callaback just before writes Allows sneaking in things in the write buffer just before it's sent to the network stack. For example ack requests, compression flushes or other things that make sense to send after stanzas or other things. This ensures any additional trailing data sent is included in the same write, and possibly the same TCP packet. Other methods used such as timers or nextTick might not have the same effect as it depends on scheduling.
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
9854
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   168
	if self.conn.sni then
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   169
		if self.servername then
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   170
			self.conn:sni(self.servername);
9857
9aea8dbb105d net.server: Only add alternate SNI contexts if at least one is provided
Kim Alvefur <zash@zash.se>
parents: 9854
diff changeset
   171
		elseif self._server and type(self._server.hosts) == "table" and next(self._server.hosts) ~= nil then
9854
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   172
			self.conn:sni(self._server.hosts, true);
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   173
		end
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   174
	end
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   175
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   176
	self.conn:settimeout( 0 )  -- set non blocking
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   177
	local handshakecallback = coroutine_wrap(function( event )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   178
		local _, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   179
		local attempt = 0
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   180
		local maxattempt = cfg.MAX_HANDSHAKE_ATTEMPTS
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   181
		while attempt < maxattempt do  -- no endless loop
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   182
			attempt = attempt + 1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   183
			debug( "ssl handshake of client with id:"..tostring(self)..", attempt:"..attempt )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   184
			if attempt > maxattempt then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   185
				self.fatalerror = "max handshake attempts exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   186
			elseif EV_TIMEOUT == event then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   187
				self.fatalerror = "timeout during handshake"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   188
			else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   189
				_, err = self.conn:dohandshake( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   190
				if not err then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   191
					self:_lock( false, false, false )  -- unlock the interface; sending, closing etc allowed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   192
					self.send = self.conn.send  -- caching table lookups with new client object
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   193
					self.receive = self.conn.receive
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   194
					if not call_onconnect then  -- trigger listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   195
						self:onstatus("ssl-handshake-complete");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   196
					end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   197
					self:_start_session( call_onconnect )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   198
					debug( "ssl handshake done" )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   199
					self.eventhandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   200
					return -1
3396
23cf369ed1c3 net.server_event: Fix to not call onconnect a second time after the SSL handshake for starttls connections (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents: 3387
diff changeset
   201
				end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   202
				if err == "wantwrite" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   203
					event = EV_WRITE
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   204
				elseif err == "wantread" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   205
					event = EV_READ
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   206
				else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   207
					debug( "ssl handshake error:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   208
					self.fatalerror = err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   209
				end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   210
			end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   211
			if self.fatalerror then
3396
23cf369ed1c3 net.server_event: Fix to not call onconnect a second time after the SSL handshake for starttls connections (thanks Flo)
Matthew Wild <mwild1@gmail.com>
parents: 3387
diff changeset
   212
				if call_onconnect then
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
   213
					self.ondisconnect = nil  -- don't call this when client isn't really connected
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   214
				end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   215
				self:_close()
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   216
				debug( "handshake failed because:", self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   217
				self.eventhandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   218
				return -1
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   219
			end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   220
			event = coroutine_yield( event, cfg.HANDSHAKE_TIMEOUT )  -- yield this monster...
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
   221
		end
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
   222
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   223
	)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   224
	debug "starting handshake..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   225
	self:_lock( false, true, true )  -- unlock read/write events, but keep interface locked
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   226
	self.eventhandshake = addevent( base, self.conn, EV_READWRITE, handshakecallback, cfg.HANDSHAKE_TIMEOUT )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   227
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   228
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   229
function interface_mt:_destroy()  -- close this interface + events and call last listener
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   230
	debug( "closing client with id:", self.id, self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   231
	self:_lock( true, true, true )  -- first of all, lock the interface to avoid further actions
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   232
	local _
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   233
	_ = self.eventread and self.eventread:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   234
	if self.type == "client" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   235
		_ = self.eventwrite and self.eventwrite:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   236
		_ = self.eventhandshake and self.eventhandshake:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   237
		_ = self.eventstarthandshake and self.eventstarthandshake:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   238
		_ = self.eventconnect and self.eventconnect:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   239
		_ = self.eventsession and self.eventsession:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   240
		_ = self.eventwritetimeout and self.eventwritetimeout:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   241
		_ = self.eventreadtimeout and self.eventreadtimeout:close( )
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
   242
		-- 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
   243
		_ = 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
   244
		_ = self.conn and self.conn:close( ) -- close connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   245
		_ = self._server and self._server:counter(-1);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   246
		self.eventread, self.eventwrite = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   247
		self.eventstarthandshake, self.eventhandshake, self.eventclose = nil, nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   248
		self.readcallback, self.writecallback = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   249
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   250
		self.conn:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   251
		self.eventread, self.eventclose = nil, nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   252
		self.interface, self.readcallback = nil, nil
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
   253
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   254
	interfacelist[ self ] = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   255
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   256
end
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
   257
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   258
function interface_mt:_lock(nointerface, noreading, nowriting)  -- lock or unlock this interface or events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   259
	self.nointerface, self.noreading, self.nowriting = nointerface, noreading, nowriting
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   260
	return nointerface, noreading, nowriting
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   261
end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   262
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   263
--TODO: Deprecate
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   264
function interface_mt:lock_read(switch)
9578
1fb3e7c550bf net.server_event: Deprecate :lock_read here too
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   265
	log("warn", ":lock_read is deprecated, use :pasue() and :resume()");
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   266
	if switch then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   267
		return self:pause();
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   268
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   269
		return self:resume();
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   270
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   271
end
3000
43a4cb707fe4 net.server_select, net.server_event: Support for :pause() and :resume() on connections
Matthew Wild <mwild1@gmail.com>
parents: 2988
diff changeset
   272
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   273
function interface_mt:pause()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   274
	return self:_lock(self.nointerface, true, self.nowriting);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   275
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   276
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   277
function interface_mt:resume()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   278
	self:_lock(self.nointerface, false, self.nowriting);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   279
	if self.readcallback and not self.eventread then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   280
		self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT );  -- register callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   281
		return true;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   282
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   283
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   284
9584
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   285
function interface_mt:pause_writes()
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   286
	return self:_lock(self.nointerface, self.noreading, true);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   287
end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   288
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   289
function interface_mt:resume_writes()
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   290
	self:_lock(self.nointerface, self.noreading, false);
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   291
	if self.writecallback and not self.eventwrite then
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   292
		self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT );  -- register callback
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   293
		return true;
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   294
	end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   295
end
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   296
1be99aedb0b3 net.server: Add an API for holding writes of outgoing data
Kim Alvefur <zash@zash.se>
parents: 9578
diff changeset
   297
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   298
function interface_mt:counter(c)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   299
	if c then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   300
		self._connections = self._connections + c
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   301
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   302
	return self._connections
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   303
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   304
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   305
-- Public methods
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   306
function interface_mt:write(data)
9919
9fe7b18bca15 net.server_event: Allow writing into buffer of write-locked connections
Kim Alvefur <zash@zash.se>
parents: 9901
diff changeset
   307
	if self.nointerface then return nil, "locked"; end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   308
	--vdebug( "try to send data to client, id/data:", self.id, data )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   309
	data = tostring( data )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   310
	local len = #data
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   311
	local total = len + self.writebufferlen
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   312
	if total > cfg.MAX_SEND_LENGTH then  -- check buffer length
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   313
		local err = "send buffer exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   314
		debug( "error:", err )  -- to much, check your app
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   315
		return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   316
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   317
	t_insert(self.writebuffer, data) -- new buffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   318
	self.writebufferlen = total
9919
9fe7b18bca15 net.server_event: Allow writing into buffer of write-locked connections
Kim Alvefur <zash@zash.se>
parents: 9901
diff changeset
   319
	if not self.eventwrite and not self.nowriting  then  -- register new write event
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   320
		--vdebug( "register new write event" )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   321
		self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   322
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   323
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   324
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   325
function interface_mt:close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   326
	if self.nointerface then return nil, "locked"; end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   327
	debug( "try to close client connection with id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   328
	if self.type == "client" then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   329
		self.fatalerror = "client to close"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   330
		if self.eventwrite then -- wait for incomplete write request
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   331
			self:_lock( true, true, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   332
			debug "closing delayed until writebuffer is empty"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   333
			return nil, "writebuffer not empty, waiting"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   334
		else -- close now
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   335
			self:_lock( true, true, true )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   336
			self:_close()
4676
1ce2ff9ec313 net.server_event: Do not automatically close clients when closing a server port
Matthew Wild <mwild1@gmail.com>
parents: 4468
diff changeset
   337
			return true
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
   338
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   339
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   340
		debug( "try to close server with id:", tostring(self.id))
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   341
		self.fatalerror = "server to close"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   342
		self:_lock( true )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   343
		self:_close( 0 )
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   344
		return true
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   345
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   346
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   347
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   348
function interface_mt:socket()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   349
	return self.conn
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   350
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   351
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   352
function interface_mt:server()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   353
	return self._server or self;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   354
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   355
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   356
function interface_mt:port()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   357
	return self._port
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   358
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   359
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   360
function interface_mt:serverport()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   361
	return self._serverport
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   362
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   363
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   364
function interface_mt:ip()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   365
	return self._ip
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   366
end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   367
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   368
function interface_mt:ssl()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   369
	return self._usingssl
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   370
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   371
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
   372
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   373
function interface_mt:type()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   374
	return self._type or "client"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   375
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   376
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   377
function interface_mt:connections()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   378
	return self._connections
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   379
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   380
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   381
function interface_mt:address()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   382
	return self.addr
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   383
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   384
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   385
function interface_mt:set_sslctx(sslctx)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   386
	self._sslctx = sslctx;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   387
	if sslctx then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   388
		self.starttls = nil; -- use starttls() of interface_mt
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   389
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   390
		self.starttls = false; -- prevent starttls()
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   391
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   392
end
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   393
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   394
function interface_mt:set_mode(pattern)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   395
	if pattern then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   396
		self._pattern = pattern;
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   397
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   398
	return self._pattern;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   399
end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   400
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   401
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
   402
	-- 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
   403
end
3001
fa00c6f563b4 net.server_select, net.server_event: Rename :pattern() method to :set_mode() for select backend, and add :set_mode() to event backend
Matthew Wild <mwild1@gmail.com>
parents: 3000
diff changeset
   404
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   405
function interface_mt:starttls(sslctx, call_onconnect)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   406
	debug( "try to start ssl at client id:", self.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   407
	local err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   408
	self._sslctx = sslctx;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   409
	if self._usingssl then  -- startssl was already called
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   410
		err = "ssl already active"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   411
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   412
	if err then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   413
		debug( "error:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   414
		return nil, err
3001
fa00c6f563b4 net.server_select, net.server_event: Rename :pattern() method to :set_mode() for select backend, and add :set_mode() to event backend
Matthew Wild <mwild1@gmail.com>
parents: 3000
diff changeset
   415
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   416
	self._usingssl = true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   417
	self.startsslcallback = function( )  -- we have to start the handshake outside of a read/write event
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   418
		self.startsslcallback = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   419
		self:_start_ssl(call_onconnect);
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   420
		self.eventstarthandshake = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   421
		return -1
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   422
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   423
	if not self.eventwrite then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   424
		self:_lock( true, true, true )  -- lock the interface, to not disturb the handshake
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   425
		self.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, self.startsslcallback, 0 )  -- add event to start handshake
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   426
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   427
		-- wait until writebuffer is empty
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   428
		self:_lock( true, true, false )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   429
		debug "ssl session delayed until writebuffer is empty..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   430
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   431
	self.starttls = false;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   432
	return true
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   433
end
5625
e67891ad18d6 net.server_event: Add support for listener.onreadtimeout(conn), which can return true to prevent the connection from being closed when a read timeout occurs
Matthew Wild <mwild1@gmail.com>
parents: 5531
diff changeset
   434
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   435
function interface_mt:setoption(option, value)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   436
	if self.conn.setoption then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   437
		return self.conn:setoption(option, value);
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   438
	end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   439
	return false, "setoption not implemented";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   440
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   441
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   442
function interface_mt:setlistener(listener, data)
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   443
	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
   444
	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
   445
	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
   446
	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
   447
	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
   448
	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
   449
	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
   450
	self.ondetach = listener.ondetach;
9388
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   451
	self.onattach = listener.onattach;
11745
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11072
diff changeset
   452
	self.onpredrain = listener.onpredrain;
7812
34ca48325ce7 net.server_event: Also replace 'ondrain' when setting new listeners (thanks Ge0rG)
Kim Alvefur <zash@zash.se>
parents: 7691
diff changeset
   453
	self.ondrain = listener.ondrain;
9390
33e52f727f0f net.connect: Fix passing request table to new listener
Kim Alvefur <zash@zash.se>
parents: 9388
diff changeset
   454
	self:onattach(data);
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   455
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   456
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   457
-- Stub handlers
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   458
function interface_mt:onconnect()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   459
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   460
function interface_mt:onincoming()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   461
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   462
function interface_mt:ondisconnect()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   463
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   464
function interface_mt:ontimeout()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   465
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   466
function interface_mt:onreadtimeout()
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   467
end
11745
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11072
diff changeset
   468
function interface_mt:onpredrain()
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11072
diff changeset
   469
end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   470
function interface_mt:ondrain()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   471
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   472
function interface_mt:ondetach()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   473
end
9388
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   474
function interface_mt:onattach()
58fe099043ed net.server: Call a 'onattach' callback when replacing listeners
Kim Alvefur <zash@zash.se>
parents: 8986
diff changeset
   475
end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   476
function interface_mt:onstatus()
2535
75bb31b6c53f net.server_event: Trailing whitespace
Matthew Wild <mwild1@gmail.com>
parents: 2534
diff changeset
   477
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
   478
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   479
-- 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
   480
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   481
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
   482
	--vdebug("creating client interfacce...")
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   483
	local interface = {
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   484
		type = "client";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   485
		conn = client;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   486
		currenttime = socket_gettime( );  -- safe the origin
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   487
		writebuffer = {};  -- writebuffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   488
		writebufferlen = 0;  -- length of writebuffer
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   489
		send = client.send;  -- caching table lookups
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   490
		receive = client.receive;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   491
		onconnect = listener.onconnect;  -- will be called when client disconnects
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   492
		ondisconnect = listener.ondisconnect;  -- will be called when client disconnects
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   493
		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
   494
		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
   495
		onreadtimeout = listener.onreadtimeout; -- called when socket inactivity timeout occurs
11745
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11072
diff changeset
   496
		onpredrain = listener.onpredrain; -- called before writes
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   497
		ondrain = listener.ondrain; -- called when writebuffer is empty
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   498
		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
   499
		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
   500
		eventread = false, eventwrite = false, eventclose = false,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   501
		eventhandshake = false, eventstarthandshake = false;  -- event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   502
		eventconnect = false, eventsession = false;  -- more event handler...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   503
		eventwritetimeout = false;  -- even more event handler...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   504
		eventreadtimeout = false;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   505
		fatalerror = false;  -- error message
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   506
		writecallback = false;  -- will be called on write events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   507
		readcallback = false;  -- will be called on read events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   508
		nointerface = true;  -- lock/unlock parameter of this interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   509
		noreading = false, nowriting = false;  -- locks of the read/writecallback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   510
		startsslcallback = false;  -- starting handshake callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   511
		position = false;  -- position of client in interfacelist
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
   512
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   513
		-- Properties
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   514
		_ip = ip, _port = port, _server = server, _pattern = pattern,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   515
		_serverport = (server and server:port() or nil),
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   516
		_sslctx = sslctx; -- parameters
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   517
		_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
   518
		extra = extra;
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   519
		servername = extra and extra.servername;
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   520
	}
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   521
	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
   522
	interface.id = tostring(interface):match("%x+$");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   523
	interface.writecallback = function( event )  -- called on write events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   524
		--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
   525
		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
   526
			--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
   527
			interface.eventwrite = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   528
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   529
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   530
		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
   531
			interface.fatalerror = "timeout during writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   532
			debug( "writing failed:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   533
			interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   534
			interface.eventwrite = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   535
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   536
		else  -- can write :)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   537
			if interface._usingssl then  -- handle luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   538
				if interface.eventreadtimeout then  -- we have to read first
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   539
					local ret = interface.readcallback( )  -- call readcallback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   540
					--vdebug( "tried to read in writecallback, result:", ret )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   541
				end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   542
				if interface.eventwritetimeout then  -- luasec only
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   543
					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
   544
					interface.eventwritetimeout = false
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   545
				end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   546
			end
11745
dcf38ac6a38c net.server: Add a predrain callaback just before writes
Kim Alvefur <zash@zash.se>
parents: 11072
diff changeset
   547
			interface:onpredrain();
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   548
			interface.writebuffer = { t_concat(interface.writebuffer) }
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   549
			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
   550
			--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
   551
			if succ then  -- writing successful
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   552
				interface.writebuffer[1] = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   553
				interface.writebufferlen = 0
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   554
				interface:ondrain();
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   555
				if interface.fatalerror then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   556
					debug "closing client after writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   557
					interface:_close()  -- close interface if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   558
				elseif interface.startsslcallback then  -- start ssl connection if needed
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   559
					debug "starting ssl handshake after writing"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   560
					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
   561
				elseif interface.writebufferlen ~= 0 then
7397
a700d54c620a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7388 7396
diff changeset
   562
					-- data possibly written from ondrain
a700d54c620a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7388 7396
diff changeset
   563
					return EV_WRITE, cfg.WRITE_TIMEOUT
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   564
				elseif interface.eventreadtimeout then
7388
17929cdacec2 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7342 7387
diff changeset
   565
					return EV_WRITE, cfg.WRITE_TIMEOUT
17929cdacec2 Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7342 7387
diff changeset
   566
				end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   567
				interface.eventwrite = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   568
				return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   569
			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
   570
				--vdebug( "writebuffer is not empty:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   571
				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
   572
				interface.writebufferlen = interface.writebufferlen - byte
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   573
				if "wantread" == err then  -- happens only with luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   574
					local callback = function( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   575
						interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   576
						interface.eventwritetimeout = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   577
						return -1;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   578
					end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   579
					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
   580
					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
   581
					-- 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
   582
					return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   583
				end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   584
				return EV_WRITE, cfg.WRITE_TIMEOUT
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   585
			else  -- connection was closed during writing or fatal error
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   586
				interface.fatalerror = err or "fatal error"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   587
				debug( "connection failed in write event:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   588
				interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   589
				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
   590
				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
   591
			end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   592
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   593
	end
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   594
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   595
	interface.readcallback = function( event )  -- called on read events
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   596
		--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
   597
		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
   598
			--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
   599
			interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   600
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   601
		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
   602
		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
   603
			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
   604
			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
   605
			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
   606
			interface.eventread = nil
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   607
			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
   608
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   609
		if interface._usingssl then  -- handle luasec
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   610
			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
   611
				local ret = interface.writecallback( )  -- call it
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   612
				--vdebug( "tried to write in readcallback, result:", tostring(ret) )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   613
			end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   614
			if interface.eventreadtimeout then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   615
				interface.eventreadtimeout:close( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   616
				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
   617
			end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   618
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   619
		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
   620
		--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
   621
		buffer = buffer or part
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   622
		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
   623
			interface.fatalerror = "receive buffer exceeded"
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   624
			debug( "fatal error:", interface.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   625
			interface:_close()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   626
			interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   627
			return -1
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 err and ( err ~= "timeout" and err ~= "wantread" ) then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   630
			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
   631
				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
   632
					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
   633
				end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   634
				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
   635
					function( ) interface:_close() end, cfg.READ_TIMEOUT)
8731
41c959c5c84b Fix spelling throughout the codebase [codespell]
Kim Alvefur <zash@zash.se>
parents: 8533
diff changeset
   636
				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
   637
				-- 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
   638
			else  -- connection was closed or fatal error
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   639
				interface.fatalerror = err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   640
				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
   641
				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
   642
				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
   643
				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
   644
			end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   645
		else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   646
			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
   647
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   648
		if interface.noreading then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   649
			interface.eventread = nil;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   650
			return -1;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   651
		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
   652
		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
   653
			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
   654
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   655
		return EV_READ, cfg.READ_TIMEOUT
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   656
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   657
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   658
	client:settimeout( 0 )  -- set non blocking
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   659
	setmetatable(interface, interface_mt)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   660
	interfacelist[ interface ] = true  -- add to interfacelist
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   661
	return interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   662
end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   663
9901
a471d4cfec5e net/server_event: fix typo in comment
Maxime “pep” Buquet <pep@bouah.net>
parents: 9857
diff changeset
   664
local function handleserver( server, addr, port, pattern, listener, sslctx, startssl )  -- creates a server interface
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   665
	debug "creating server interface..."
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   666
	local interface = {
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   667
		_connections = 0;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   668
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   669
		type = "server";
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   670
		conn = server;
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   671
		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
   672
		eventread = false;  -- read event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   673
		eventclose = false; -- close event handler
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   674
		readcallback = false; -- read event callback
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   675
		fatalerror = false; -- error message
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   676
		nointerface = true;  -- lock/unlock parameter
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   677
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   678
		_ip = addr, _port = port, _pattern = pattern,
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   679
		_sslctx = sslctx;
9854
9a905888b96c net.server_event: Add SNI support (#409)
Kim Alvefur <zash@zash.se>
parents: 9839
diff changeset
   680
		hosts = {};
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   681
	}
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   682
	interface.id = tostring(interface):match("%x+$");
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   683
	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
   684
		--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
   685
		if interface.fatalerror then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   686
			--vdebug( "leaving this event because:", self.fatalerror )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   687
			interface.eventread = nil
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   688
			return -1
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   689
		end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   690
		local delay = cfg.ACCEPT_DELAY
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   691
		if EV_TIMEOUT == event then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   692
			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
   693
				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
   694
				return EV_TIMEOUT, delay  -- timeout...
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   695
			else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   696
				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
   697
			end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   698
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   699
		--vdebug("max connection check ok, accepting...")
10551
c77471c180ea net.server_event: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 10411
diff changeset
   700
		-- luacheck: ignore 231/err
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   701
		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
   702
		while client do
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   703
			if interface._connections >= cfg.MAX_CONNECTIONS then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   704
				client:close( )  -- refuse connection
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   705
				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
   706
				return EV_TIMEOUT, delay  -- delay for next accept attempt
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   707
			end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   708
			local client_ip, client_port = client:getpeername( )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   709
			interface._connections = interface._connections + 1  -- increase connection count
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   710
			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
   711
			--vdebug( "client id:", clientinterface, "startssl:", startssl )
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   712
			if has_luasec and startssl then
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   713
				clientinterface:starttls(sslctx, true)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   714
			else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   715
				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
   716
			end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   717
			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
   718
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   719
			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
   720
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   721
		return EV_READ
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   722
	end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   723
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   724
	server:settimeout( 0 )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   725
	setmetatable(interface, interface_mt)
7227
07a4c807a94a Merge 0.9->0.10
Kim Alvefur <zash@zash.se>
parents: 7043 7226
diff changeset
   726
	interfacelist[ interface ] = true
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   727
	interface:_start_session()
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   728
	return interface
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   729
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   730
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   731
local function listen(addr, port, listener, config)
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   732
	config = config or {}
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   733
	if config.sslctx and not has_luasec then
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   734
		debug "fatal error: luasec not found"
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   735
		return nil, "luasec not found"
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   736
	end
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   737
	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
   738
	if not server then
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   739
		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
   740
		return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   741
	end
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   742
	local interface = handleserver( server, addr, port, config.read_size, listener, config.tls_ctx, config.tls_direct)  -- new server handler
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   743
	debug( "new server created with id:", tostring(interface))
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   744
	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
   745
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   746
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   747
local function addserver( addr, port, listener, pattern, sslctx )  -- TODO: check arguments
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   748
	--vdebug( "creating new tcp server with following parameters:", addr or "nil", port or "nil", sslctx or "nil", startssl or "nil")
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   749
	return listen( addr, port, listener, {
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   750
		read_size = pattern,
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   751
		tls_ctx = sslctx,
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   752
		tls_direct = not not sslctx,
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   753
	});
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   754
end
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   755
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   756
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
   757
	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
   758
	interface:_start_connection(sslctx)
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   759
	return interface, client
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   760
	--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
   761
end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   762
11067
30d3f6f85eb8 net.server: Backport client parts of SNI support from trunk (#409)
Kim Alvefur <zash@zash.se>
parents: 9502
diff changeset
   763
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
   764
	if sslctx and not has_luasec then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   765
		debug "need luasec, but not available"
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   766
		return nil, "luasec not found"
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   767
	end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   768
	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
   769
		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
   770
		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
   771
		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
   772
			typ = "tcp6";
5fdda751333a net.server: Require IP address as argument to addclient (no DNS names)
Kim Alvefur <zash@zash.se>
parents: 9390
diff changeset
   773
		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
   774
			typ = "tcp4";
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   775
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   776
	end
9498
89e05b118f6e net.server: Remove socket constructor fallback
Kim Alvefur <zash@zash.se>
parents: 9476
diff changeset
   777
	local create = socket[typ];
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   778
	if type( create ) ~= "function"  then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   779
		return nil, "invalid socket type"
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   780
	end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   781
	local client, err = create()  -- creating new socket
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   782
	if not client then
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   783
		debug( "cannot create socket:", err )
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   784
		return nil, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   785
	end
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   786
	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
   787
	local res, err = client:setpeername( addr, serverport )  -- connect
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   788
	if res or ( err == "timeout" ) then
10551
c77471c180ea net.server_event: Silence luacheck warnings
Kim Alvefur <zash@zash.se>
parents: 10411
diff changeset
   789
		-- luacheck: ignore 211/port
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   790
		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
   791
		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
   792
		debug( "new connection id:", interface.id )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   793
		return interface, err
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   794
	else
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   795
		debug( "new connection failed:", err )
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   796
		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
   797
	end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   798
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   799
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   800
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
   801
	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
   802
	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
   803
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   804
6853
41de00647ad3 server_event: Move local references to various functions to top of file
Kim Alvefur <zash@zash.se>
parents: 6852
diff changeset
   805
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
   806
	return addevent( base, ... )
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   807
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
   808
6854
1f1bed8ebc41 server_event: Remove needless scoping and indentation
Kim Alvefur <zash@zash.se>
parents: 6853
diff changeset
   809
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
   810
	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
   811
		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
   812
			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
   813
		end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   814
	end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   815
end
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   816
2335
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
   817
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
   818
	if yes then
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   819
		-- 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
   820
		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
   821
			closeallservers();
469f78fe1c3e net.server_event: Don't close servers if just quitting the loop once
Matthew Wild <mwild1@gmail.com>
parents: 8731
diff changeset
   822
		end
7339
0d9ac472e58c server_event: Fix indentation (again)
Kim Alvefur <zash@zash.se>
parents: 7227
diff changeset
   823
		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
   824
	end
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
   825
end
060fb67cefd5 net.server_event: Add setquitting() function to be compatible with net.server_select
Matthew Wild <mwild1@gmail.com>
parents: 2334
diff changeset
   826
4399
1b4161970842 net.server_event, net.server_select: Fixed some global pollution.
Waqas Hussain <waqas20@gmail.com>
parents: 4377
diff changeset
   827
local function get_backend()
8317
1d2149d84c72 net.server_event: Add "libevent" to backend description
Kim Alvefur <zash@zash.se>
parents: 7813
diff changeset
   828
	return "libevent " .. base:method();
2340
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
   829
end
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
   830
2434
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
   831
-- 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
   832
-- 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
   833
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
   834
local function hook_signal(signal_num, handler)
6859
489f4ae291bf server_event: Remove unused argument [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6858
diff changeset
   835
	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
   836
		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
   837
		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
   838
			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
   839
		end
4403d4473783 net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
Matthew Wild <mwild1@gmail.com>
parents: 2375
diff changeset
   840
		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
   841
	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
   842
	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
   843
	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
   844
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
   845
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
   846
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
   847
	local sender_locked;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
   848
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
   849
	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
   850
		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
   851
			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
   852
			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
   853
		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
   854
	end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5756
diff changeset
   855
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
   856
	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
   857
		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
   858
		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
   859
			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
   860
			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
   861
		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
   862
	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
   863
	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
   864
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
   865
6865
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   866
local function add_task(delay, callback)
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   867
	local event_handle;
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   868
	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
   869
		local ret = callback(socket_gettime());
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   870
		if ret then
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   871
			return 0, ret;
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   872
		elseif event_handle then
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   873
			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
   874
		end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
   875
	end
6865
7a81fb23de5d server_event: Remove needless scoping around add_task
Kim Alvefur <zash@zash.se>
parents: 6864
diff changeset
   876
	, 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
   877
	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
   878
end
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 6383
diff changeset
   879
8784
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   880
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
   881
	local handle = {};
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   882
	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
   883
		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
   884
			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
   885
				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
   886
					onreadable(self);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   887
				end);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   888
			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
   889
				self.wantread:close();
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   890
				self.wantread = nil;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   891
			end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   892
		end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   893
		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
   894
			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
   895
				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
   896
					onwriteable(self);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   897
				end);
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   898
			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
   899
				self.wantwrite:close();
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   900
				self.wantwrite = nil;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   901
			end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   902
		end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   903
	end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   904
	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
   905
	return handle;
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   906
end
53178b6ba589 net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents: 8754
diff changeset
   907
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   908
return {
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   909
	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
   910
	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
   911
	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
   912
	link = link,
6856
a2cc477eb19b server_event: Rename luaevent module variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 6855
diff changeset
   913
	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
   914
	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
   915
	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
   916
	addserver = addserver,
9839
20bf5b47c1fb net.server: New API for creating server listeners
Kim Alvefur <zash@zash.se>
parents: 9584
diff changeset
   917
	listen = listen,
2318
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   918
	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
   919
	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
   920
	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
   921
	closeall = closeallservers,
2340
b286d60cb4fc net.server_event: Add get_backend() method
Matthew Wild <mwild1@gmail.com>
parents: 2336
diff changeset
   922
	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
   923
	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
   924
	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
   925
	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
   926
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   927
	__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
   928
	__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
   929
	__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
   930
	__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
   931
a831de056de3 net.server_select, net.server_event: Convert to unix line endings from Windows
Matthew Wild <mwild1@gmail.com>
parents: 2303
diff changeset
   932
}