net/server.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 03 Dec 2008 14:39:07 +0000
changeset 519 cccd610a0ef9
parent 374 ff502dada372
child 528 5fabb5aeed9d
permissions -rw-r--r--
Insert copyright/license headers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
     1
-- Prosody IM v0.1
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
     2
-- Copyright (C) 2008 Matthew Wild
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
     3
-- Copyright (C) 2008 Waqas Hussain
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
     4
-- 
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
     5
-- This program is free software; you can redistribute it and/or
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
     6
-- modify it under the terms of the GNU General Public License
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
     7
-- as published by the Free Software Foundation; either version 2
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
     8
-- of the License, or (at your option) any later version.
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
     9
-- 
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    10
-- This program is distributed in the hope that it will be useful,
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    11
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    12
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    13
-- GNU General Public License for more details.
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    14
-- 
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    15
-- You should have received a copy of the GNU General Public License
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    16
-- along with this program; if not, write to the Free Software
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    17
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    18
--
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    19
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 374
diff changeset
    20
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    21
--[[
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    22
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
    23
		server.lua by blastbeat of the luadch project
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
    24
		
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
    25
		re-used here under the MIT/X Consortium License
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    26
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
    27
		- this script contains the server loop of the program
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
    28
		- other scripts can reg a server here
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    29
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    30
]]--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    31
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    32
----------------------------------// DECLARATION //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    33
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    34
--// constants //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    35
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    36
local STAT_UNIT = 1 / ( 1024 * 1024 )    -- mb
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    37
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    38
--// lua functions //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    39
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    40
local function use( what ) return _G[ what ] end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    41
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    42
local type = use "type"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    43
local pairs = use "pairs"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    44
local ipairs = use "ipairs"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    45
local tostring = use "tostring"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    46
local collectgarbage = use "collectgarbage"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    47
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    48
--// lua libs //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    49
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    50
local table = use "table"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    51
local coroutine = use "coroutine"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    52
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    53
--// lua lib methods //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    54
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    55
local table_concat = table.concat
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    56
local table_remove = table.remove
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    57
local string_sub = use'string'.sub
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    58
local coroutine_wrap = coroutine.wrap
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    59
local coroutine_yield = coroutine.yield
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    60
local print = print;
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    61
local out_put = function () end --print;
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    62
local out_error = print;
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    63
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    64
--// extern libs //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    65
98
3a2d327c4856 server.lua should degrade gracefully when LuaSec not present
Matthew Wild <mwild1@gmail.com>
parents: 74
diff changeset
    66
local luasec = select(2, pcall(require, "ssl"))
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    67
local luasocket = require "socket"
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    68
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    69
--// extern lib methods //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    70
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    71
local ssl_wrap = ( luasec and luasec.wrap )
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    72
local socket_bind = luasocket.bind
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    73
local socket_select = luasocket.select
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    74
local ssl_newcontext = ( luasec and luasec.newcontext )
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    75
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    76
--// functions //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    77
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    78
local loop
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    79
local stats
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    80
local addtimer
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    81
local closeall
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    82
local addserver
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    83
local firetimer
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    84
local closesocket
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    85
local removesocket
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    86
local wrapserver
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    87
local wraptcpclient
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    88
local wrapsslclient
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    89
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    90
--// tables //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    91
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    92
local listener
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    93
local readlist
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    94
local writelist
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    95
local socketlist
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    96
local timelistener
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    97
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    98
--// simple data types //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
    99
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   100
local _
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   101
local readlen = 0    -- length of readlist
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   102
local writelen = 0    -- lenght of writelist
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   103
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   104
local sendstat= 0
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   105
local receivestat = 0
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   106
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   107
----------------------------------// DEFINITION //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   108
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   109
listener = { }    -- key = port, value = table
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   110
readlist = { }    -- array with sockets to read from
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   111
writelist = { }    -- arrary with sockets to write to
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   112
socketlist = { }    -- key = socket, value = wrapped socket
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   113
timelistener = { }
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   114
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   115
stats = function( )
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   116
	return receivestat, sendstat
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   117
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   118
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   119
wrapserver = function( listener, socket, ip, serverport, mode, sslctx )    -- this function wraps a server
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   120
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   121
	local dispatch, disconnect = listener.listener, listener.disconnect    -- dangerous
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   122
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   123
	local wrapclient, err
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   124
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   125
	if sslctx then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   126
		if not ssl_newcontext then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   127
			return nil, "luasec not found"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   128
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   129
		if type( sslctx ) ~= "table" then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   130
			out_error "server.lua: wrong server sslctx"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   131
			return nil, "wrong server sslctx"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   132
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   133
		sslctx, err = ssl_newcontext( sslctx )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   134
		if not sslctx then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   135
			err = err or "wrong sslctx parameters"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   136
			out_error( "server.lua: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   137
			return nil, err
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   138
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   139
		wrapclient = wrapsslclient
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   140
		wrapclient = wraptlsclient
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   141
	else
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   142
		wrapclient = wraptcpclient
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   143
	end
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   144
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   145
	local accept = socket.accept
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   146
	local close = socket.close
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   147
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   148
	--// public methods of the object //--    
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   149
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   150
	local handler = { }
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   151
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   152
	handler.shutdown = function( ) end
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   153
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   154
	--[[handler.listener = function( data, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   155
		return ondata( handler, data, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   156
	end]]
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   157
	handler.ssl = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   158
		return sslctx and true or false
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   159
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   160
	handler.close = function( closed )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   161
		_ = not closed and close( socket )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   162
		writelen = removesocket( writelist, socket, writelen )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   163
		readlen = removesocket( readlist, socket, readlen )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   164
		socketlist[ socket ] = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   165
		handler = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   166
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   167
	handler.ip = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   168
		return ip
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   169
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   170
	handler.serverport = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   171
		return serverport
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   172
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   173
	handler.socket = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   174
		return socket
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   175
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   176
	handler.receivedata = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   177
		local client, err = accept( socket )    -- try to accept
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   178
		if client then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   179
			local ip, clientport = client:getpeername( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   180
			client:settimeout( 0 )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   181
			local handler, client, err = wrapclient( listener, client, ip, serverport, clientport, mode, sslctx )    -- wrap new client socket
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   182
			if err then    -- error while wrapping ssl socket
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   183
				return false
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   184
			end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   185
			out_put( "server.lua: accepted new client connection from ", ip, ":", clientport )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   186
			return dispatch( handler )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   187
		elseif err then    -- maybe timeout or something else
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   188
			out_put( "server.lua: error with new client connection: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   189
			return false
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   190
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   191
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   192
	return handler
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   193
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   194
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   195
wrapsslclient = function( listener, socket, ip, serverport, clientport, mode, sslctx )    -- this function wraps a ssl cleint
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   196
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   197
	local dispatch, disconnect = listener.listener, listener.disconnect
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   198
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   199
	--// transform socket to ssl object //--
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   200
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   201
	local err
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   202
	socket, err = ssl_wrap( socket, sslctx )    -- wrap socket
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   203
	if err then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   204
		out_put( "server.lua: ssl error: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   205
		return nil, nil, err    -- fatal error
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   206
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   207
	socket:settimeout( 0 )
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   208
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   209
	--// private closures of the object //--
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   210
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   211
	local writequeue = { }    -- buffer for messages to send
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   212
335
906311ff2170 Fix to prevent send retry when connection is already closed
Matthew Wild <mwild1@gmail.com>
parents: 328
diff changeset
   213
	local eol, fatal_send_error   -- end of buffer
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   214
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   215
	local sstat, rstat = 0, 0
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   216
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   217
	--// local import of socket methods //--
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   218
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   219
	local send = socket.send
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   220
	local receive = socket.receive
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   221
	local close = socket.close
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   222
	--local shutdown = socket.shutdown
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   223
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   224
	--// public methods of the object //--
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   225
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   226
	local handler = { }
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   227
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   228
	handler.getstats = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   229
		return rstat, sstat
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   230
	end
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   231
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   232
	handler.listener = function( data, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   233
		return listener( handler, data, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   234
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   235
	handler.ssl = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   236
		return true
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   237
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   238
	handler.send = function( _, data, i, j )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   239
			return send( socket, data, i, j )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   240
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   241
	handler.receive = function( pattern, prefix )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   242
			return receive( socket, pattern, prefix )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   243
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   244
	handler.shutdown = function( pattern )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   245
		--return shutdown( socket, pattern )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   246
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   247
	handler.close = function( closed )
335
906311ff2170 Fix to prevent send retry when connection is already closed
Matthew Wild <mwild1@gmail.com>
parents: 328
diff changeset
   248
		if eol and not fatal_send_error then handler._dispatchdata(); end
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   249
		close( socket )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   250
		writelen = ( eol and removesocket( writelist, socket, writelen ) ) or writelen
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   251
		readlen = removesocket( readlist, socket, readlen )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   252
		socketlist[ socket ] = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   253
		out_put "server.lua: closed handler and removed socket from list"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   254
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   255
	handler.ip = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   256
		return ip
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   257
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   258
	handler.serverport = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   259
		return serverport
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   260
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   261
	handler.clientport = function( ) 
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   262
		return clientport
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   263
	end
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   264
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   265
	handler.write = function( data )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   266
		if not eol then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   267
			writelen = writelen + 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   268
			writelist[ writelen ] = socket
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   269
			eol = 0
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   270
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   271
		eol = eol + 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   272
		writequeue[ eol ] = data
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   273
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   274
	handler.writequeue = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   275
		return writequeue
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   276
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   277
	handler.socket = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   278
		return socket
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   279
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   280
	handler.mode = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   281
		return mode
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   282
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   283
	handler._receivedata = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   284
		local data, err, part = receive( socket, mode )    -- receive data in "mode"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   285
		if not err or ( err == "timeout" or err == "wantread" ) then    -- received something
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   286
			local data = data or part or ""
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   287
			local count = #data * STAT_UNIT
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   288
			rstat = rstat + count
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   289
			receivestat = receivestat + count
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   290
			out_put( "server.lua: read data '", data, "', error: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   291
			return dispatch( handler, data, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   292
		else    -- connections was closed or fatal error
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   293
			out_put( "server.lua: client ", ip, ":", clientport, " error: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   294
			handler.close( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   295
			disconnect( handler, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   296
			writequeue = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   297
			handler = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   298
			return false
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   299
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   300
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   301
	handler._dispatchdata = function( )    -- this function writes data to handlers
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   302
		local buffer = table_concat( writequeue, "", 1, eol )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   303
		local succ, err, byte = send( socket, buffer )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   304
		local count = ( succ or 0 ) * STAT_UNIT
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   305
		sstat = sstat + count
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   306
		sendstat = sendstat + count
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   307
		out_put( "server.lua: sended '", buffer, "', bytes: ", succ, ", error: ", err, ", part: ", byte, ", to: ", ip, ":", clientport )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   308
		if succ then    -- sending succesful
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   309
			--writequeue = { }
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   310
			eol = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   311
			writelen = removesocket( writelist, socket, writelen )    -- delete socket from writelist
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   312
			return true
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   313
		elseif byte and ( err == "timeout" or err == "wantwrite" ) then    -- want write
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   314
			buffer = string_sub( buffer, byte + 1, -1 )    -- new buffer
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   315
			writequeue[ 1 ] = buffer    -- insert new buffer in queue
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   316
			eol = 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   317
			return true
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   318
		else    -- connection was closed during sending or fatal error
335
906311ff2170 Fix to prevent send retry when connection is already closed
Matthew Wild <mwild1@gmail.com>
parents: 328
diff changeset
   319
			fatal_send_error = true;
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   320
			out_put( "server.lua: client ", ip, ":", clientport, " error: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   321
			handler.close( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   322
			disconnect( handler, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   323
			writequeue = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   324
			handler = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   325
			return false
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   326
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   327
	end
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   328
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   329
	-- // COMPAT // --
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   330
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   331
	handler.getIp = handler.ip
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   332
	handler.getPort = handler.clientport
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   333
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   334
	--// handshake //--
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   335
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   336
	local wrote
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   337
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   338
	handler.handshake = coroutine_wrap( function( client )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   339
			local err
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   340
			for i = 1, 10 do    -- 10 handshake attemps
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   341
				_, err = client:dohandshake( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   342
				if not err then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   343
					out_put( "server.lua: ssl handshake done" )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   344
					writelen = ( wrote and removesocket( writelist, socket, writelen ) ) or writelen
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   345
					handler.receivedata = handler._receivedata    -- when handshake is done, replace the handshake function with regular functions
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   346
					handler.dispatchdata = handler._dispatchdata
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   347
					return dispatch( handler )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   348
				else
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   349
					out_put( "server.lua: error during ssl handshake: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   350
					if err == "wantwrite" then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   351
						if wrote == nil then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   352
							writelen = writelen + 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   353
							writelist[ writelen ] = client
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   354
							wrote = true
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   355
						end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   356
					end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   357
					coroutine_yield( handler, nil, err )    -- handshake not finished
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   358
				end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   359
			end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   360
			_ = err ~= "closed" and close( socket )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   361
			handler.close( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   362
			disconnect( handler, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   363
			writequeue = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   364
			handler = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   365
			return false    -- handshake failed
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   366
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   367
	)
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   368
	handler.receivedata = handler.handshake
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   369
	handler.dispatchdata = handler.handshake
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   370
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   371
	handler.handshake( socket )    -- do handshake
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   372
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   373
	socketlist[ socket ] = handler
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   374
	readlen = readlen + 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   375
	readlist[ readlen ] = socket
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   376
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   377
	return handler, socket
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   378
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   379
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   380
wraptlsclient = function( listener, socket, ip, serverport, clientport, mode, sslctx )    -- this function wraps a tls cleint
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   381
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   382
	local dispatch, disconnect = listener.listener, listener.disconnect
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   383
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   384
	--// transform socket to ssl object //--
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   385
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   386
	local err
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   387
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   388
	socket:settimeout( 0 )
328
a1d25769970f Flush write queue before closing socket
Matthew Wild <mwild1@gmail.com>
parents: 319
diff changeset
   389
	out_put("setting linger on "..tostring(socket))
a1d25769970f Flush write queue before closing socket
Matthew Wild <mwild1@gmail.com>
parents: 319
diff changeset
   390
	socket:setoption("linger", { on = true, timeout = 10 });
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   391
	--// private closures of the object //--
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   392
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   393
	local writequeue = { }    -- buffer for messages to send
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   394
335
906311ff2170 Fix to prevent send retry when connection is already closed
Matthew Wild <mwild1@gmail.com>
parents: 328
diff changeset
   395
	local eol, fatal_send_error   -- end of buffer
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   396
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   397
	local sstat, rstat = 0, 0
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   398
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   399
	--// local import of socket methods //--
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   400
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   401
	local send = socket.send
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   402
	local receive = socket.receive
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   403
	local close = socket.close
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   404
	--local shutdown = socket.shutdown
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   405
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   406
	--// public methods of the object //--
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   407
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   408
	local handler = { }
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   409
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   410
	handler.getstats = function( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   411
		return rstat, sstat
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   412
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   413
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   414
	handler.listener = function( data, err )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   415
		return listener( handler, data, err )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   416
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   417
	handler.ssl = function( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   418
		return false
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   419
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   420
	handler.send = function( _, data, i, j )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   421
			return send( socket, data, i, j )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   422
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   423
	handler.receive = function( pattern, prefix )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   424
			return receive( socket, pattern, prefix )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   425
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   426
	handler.shutdown = function( pattern )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   427
		--return shutdown( socket, pattern )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   428
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   429
	handler.close = function( closed )
335
906311ff2170 Fix to prevent send retry when connection is already closed
Matthew Wild <mwild1@gmail.com>
parents: 328
diff changeset
   430
		if eol and not fatal_send_error then handler._dispatchdata(); end
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   431
		close( socket )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   432
		writelen = ( eol and removesocket( writelist, socket, writelen ) ) or writelen
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   433
		readlen = removesocket( readlist, socket, readlen )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   434
		socketlist[ socket ] = nil
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   435
		out_put "server.lua: closed handler and removed socket from list"
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   436
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   437
	handler.ip = function( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   438
		return ip
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   439
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   440
	handler.serverport = function( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   441
		return serverport
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   442
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   443
	handler.clientport = function( ) 
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   444
		return clientport
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   445
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   446
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   447
	handler.write = function( data )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   448
		if not eol then
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   449
			writelen = writelen + 1
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   450
			writelist[ writelen ] = socket
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   451
			eol = 0
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   452
		end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   453
		eol = eol + 1
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   454
		writequeue[ eol ] = data
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   455
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   456
	handler.writequeue = function( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   457
		return writequeue
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   458
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   459
	handler.socket = function( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   460
		return socket
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   461
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   462
	handler.mode = function( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   463
		return mode
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   464
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   465
	handler._receivedata = function( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   466
		local data, err, part = receive( socket, mode )    -- receive data in "mode"
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   467
		if not err or ( err == "timeout" or err == "wantread" ) then    -- received something
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   468
			local data = data or part or ""
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   469
			local count = #data * STAT_UNIT
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   470
			rstat = rstat + count
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   471
			receivestat = receivestat + count
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   472
			--out_put( "server.lua: read data '", data, "', error: ", err )
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   473
			return dispatch( handler, data, err )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   474
		else    -- connections was closed or fatal error
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   475
			out_put( "server.lua: client ", ip, ":", clientport, " error: ", err )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   476
			handler.close( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   477
			disconnect( handler, err )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   478
			writequeue = nil
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   479
			handler = nil
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   480
			return false
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   481
		end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   482
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   483
	handler._dispatchdata = function( )    -- this function writes data to handlers
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   484
		local buffer = table_concat( writequeue, "", 1, eol )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   485
		local succ, err, byte = send( socket, buffer )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   486
		local count = ( succ or 0 ) * STAT_UNIT
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   487
		sstat = sstat + count
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   488
		sendstat = sendstat + count
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   489
		out_put( "server.lua: sended '", buffer, "', bytes: ", succ, ", error: ", err, ", part: ", byte, ", to: ", ip, ":", clientport )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   490
		if succ then    -- sending succesful
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   491
			--writequeue = { }
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   492
			eol = nil
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   493
			writelen = removesocket( writelist, socket, writelen )    -- delete socket from writelist
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   494
			if handler.need_tls then
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   495
				out_put("server.lua: connection is ready for tls handshake");
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   496
				handler.starttls(true);
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   497
				if handler.need_tls then
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   498
					out_put("server.lua: uh-oh... we still want tls, something must be wrong");
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   499
				end
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   500
			end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   501
			return true
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   502
		elseif byte and ( err == "timeout" or err == "wantwrite" ) then    -- want write
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   503
			buffer = string_sub( buffer, byte + 1, -1 )    -- new buffer
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   504
			writequeue[ 1 ] = buffer    -- insert new buffer in queue
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   505
			eol = 1
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   506
			return true
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   507
		else    -- connection was closed during sending or fatal error
335
906311ff2170 Fix to prevent send retry when connection is already closed
Matthew Wild <mwild1@gmail.com>
parents: 328
diff changeset
   508
			fatal_send_error = true; -- :(
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   509
			out_put( "server.lua: client ", ip, ":", clientport, " error: ", err )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   510
			handler.close( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   511
			disconnect( handler, err )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   512
			writequeue = nil
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   513
			handler = nil
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   514
			return false
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   515
		end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   516
	end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   517
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   518
	handler.receivedata, handler.dispatchdata = handler._receivedata, handler._dispatchdata;
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   519
	-- // COMPAT // --
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   520
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   521
	handler.getIp = handler.ip
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   522
	handler.getPort = handler.clientport
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   523
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   524
	--// handshake //--
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   525
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   526
	local wrote, read
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   527
	
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   528
	handler.starttls = function (now)
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   529
		if not now then out_put("server.lua: we need to do tls, but delaying until later"); handler.need_tls = true; return; end
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   530
		out_put( "server.lua: attempting to start tls on "..tostring(socket) )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   531
		socket, err = ssl_wrap( socket, sslctx )    -- wrap socket
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   532
		out_put("sslwrapped socket is "..tostring(socket));
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   533
		if err then
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   534
			out_put( "server.lua: ssl error: ", err )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   535
			return nil, nil, err    -- fatal error
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   536
		end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   537
		socket:settimeout( 1 )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   538
		send = socket.send
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   539
		receive = socket.receive
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   540
		close = socket.close
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   541
		handler.ssl = function( )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   542
			return true
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   543
		end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   544
		handler.send = function( _, data, i, j )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   545
			return send( socket, data, i, j )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   546
		end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   547
		handler.receive = function( pattern, prefix )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   548
			return receive( socket, pattern, prefix )
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   549
		end
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   550
		
319
4a8a949c3870 Fix for putting TLS in stream:features for connections already using TLS. Thanks to albert for spotting.
Matthew Wild <mwild1@gmail.com>
parents: 127
diff changeset
   551
		handler.starttls = nil;
4a8a949c3870 Fix for putting TLS in stream:features for connections already using TLS. Thanks to albert for spotting.
Matthew Wild <mwild1@gmail.com>
parents: 127
diff changeset
   552
		
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   553
			handler.handshake = coroutine_wrap( function( client )
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   554
					local err
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   555
					for i = 1, 10 do    -- 10 handshake attemps
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   556
						_, err = client:dohandshake( )
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   557
						if not err then
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   558
							out_put( "server.lua: ssl handshake done" )
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   559
							writelen = ( wrote and removesocket( writelist, socket, writelen ) ) or writelen
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   560
							handler.receivedata = handler._receivedata    -- when handshake is done, replace the handshake function with regular functions
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   561
							handler.dispatchdata = handler._dispatchdata
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   562
							handler.need_tls = nil
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   563
							socketlist[ client ] = handler
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   564
							readlen = readlen + 1
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   565
							readlist[ readlen ] = client												
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   566
							return true;
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   567
						else
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   568
							out_put( "server.lua: error during ssl handshake: ", err )
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   569
							if err == "wantwrite" then
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   570
								if wrote == nil then
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   571
									writelen = writelen + 1
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   572
									writelist[ writelen ] = client
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   573
									wrote = true
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   574
								end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   575
							end
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   576
							coroutine_yield( handler, nil, err )    -- handshake not finished
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   577
						end
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   578
					end
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   579
					_ = err ~= "closed" and close( socket )
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   580
					handler.close( )
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   581
					disconnect( handler, err )
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   582
					writequeue = nil
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   583
					handler = nil
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   584
					return false    -- handshake failed
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   585
				end
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   586
			)
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   587
			handler.receivedata = handler.handshake
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   588
			handler.dispatchdata = handler.handshake
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   589
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   590
			handler.handshake( socket )    -- do handshake
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   591
		end
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   592
	socketlist[ socket ] = handler
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   593
	readlen = readlen + 1
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   594
	readlist[ readlen ] = socket
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   595
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   596
	return handler, socket
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   597
end
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   598
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   599
wraptcpclient = function( listener, socket, ip, serverport, clientport, mode )    -- this function wraps a socket
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   600
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   601
	local dispatch, disconnect = listener.listener, listener.disconnect
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   602
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   603
	--// private closures of the object //--
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   604
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   605
	local writequeue = { }    -- list for messages to send
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   606
335
906311ff2170 Fix to prevent send retry when connection is already closed
Matthew Wild <mwild1@gmail.com>
parents: 328
diff changeset
   607
	local eol, fatal_send_error
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   608
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   609
	local rstat, sstat = 0, 0
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   610
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   611
	--// local import of socket methods //--
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   612
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   613
	local send = socket.send
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   614
	local receive = socket.receive
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   615
	local close = socket.close
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   616
	local shutdown = socket.shutdown
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   617
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   618
	--// public methods of the object //--
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   619
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   620
	local handler = { }
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   621
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   622
	handler.getstats = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   623
		return rstat, sstat
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   624
	end
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   625
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   626
	handler.listener = function( data, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   627
		return listener( handler, data, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   628
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   629
	handler.ssl = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   630
		return false
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   631
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   632
	handler.send = function( _, data, i, j )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   633
			return send( socket, data, i, j )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   634
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   635
	handler.receive = function( pattern, prefix )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   636
			return receive( socket, pattern, prefix )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   637
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   638
	handler.shutdown = function( pattern )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   639
		return shutdown( socket, pattern )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   640
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   641
	handler.close = function( closed )
374
ff502dada372 All the people who don't use TLS, this one's for you.
Matthew Wild <mwild1@gmail.com>
parents: 335
diff changeset
   642
		if eol and not fatal_send_error then handler.dispatchdata(); end
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   643
		_ = not closed and shutdown( socket )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   644
		_ = not closed and close( socket )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   645
		writelen = ( eol and removesocket( writelist, socket, writelen ) ) or writelen
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   646
		readlen = removesocket( readlist, socket, readlen )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   647
		socketlist[ socket ] = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   648
		out_put "server.lua: closed handler and removed socket from list"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   649
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   650
	handler.ip = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   651
		return ip
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   652
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   653
	handler.serverport = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   654
		return serverport
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   655
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   656
	handler.clientport = function( ) 
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   657
		return clientport
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   658
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   659
	handler.write = function( data )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   660
		if not eol then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   661
			writelen = writelen + 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   662
			writelist[ writelen ] = socket
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   663
			eol = 0
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   664
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   665
		eol = eol + 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   666
		writequeue[ eol ] = data
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   667
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   668
	handler.writequeue = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   669
		return writequeue
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   670
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   671
	handler.socket = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   672
		return socket
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   673
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   674
	handler.mode = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   675
		return mode
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   676
	end
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   677
	
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   678
	handler.receivedata = function( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   679
		local data, err, part = receive( socket, mode )    -- receive data in "mode"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   680
		if not err or ( err == "timeout" or err == "wantread" ) then    -- received something
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   681
			local data = data or part or ""
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   682
			local count = #data * STAT_UNIT
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   683
			rstat = rstat + count
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   684
			receivestat = receivestat + count
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   685
			out_put( "server.lua: read data '", data, "', error: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   686
			return dispatch( handler, data, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   687
		else    -- connections was closed or fatal error
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   688
			out_put( "server.lua: client ", ip, ":", clientport, " error: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   689
			handler.close( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   690
			disconnect( handler, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   691
			writequeue = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   692
			handler = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   693
			return false
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   694
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   695
	end
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   696
	
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   697
	handler.dispatchdata = function( )    -- this function writes data to handlers
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   698
		local buffer = table_concat( writequeue, "", 1, eol )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   699
		local succ, err, byte = send( socket, buffer )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   700
		local count = ( succ or 0 ) * STAT_UNIT
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   701
		sstat = sstat + count
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   702
		sendstat = sendstat + count
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   703
		out_put( "server.lua: sended '", buffer, "', bytes: ", succ, ", error: ", err, ", part: ", byte, ", to: ", ip, ":", clientport )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   704
		if succ then    -- sending succesful
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   705
			--writequeue = { }
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   706
			eol = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   707
			writelen = removesocket( writelist, socket, writelen )    -- delete socket from writelist
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   708
			return true
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   709
		elseif byte and ( err == "timeout" or err == "wantwrite" ) then    -- want write
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   710
			buffer = string_sub( buffer, byte + 1, -1 )    -- new buffer
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   711
			writequeue[ 1 ] = buffer    -- insert new buffer in queue
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   712
			eol = 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   713
			return true
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   714
		else    -- connection was closed during sending or fatal error
335
906311ff2170 Fix to prevent send retry when connection is already closed
Matthew Wild <mwild1@gmail.com>
parents: 328
diff changeset
   715
			fatal_send_error = true; -- :'-(
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   716
			out_put( "server.lua: client ", ip, ":", clientport, " error: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   717
			handler.close( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   718
			disconnect( handler, err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   719
			writequeue = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   720
			handler = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   721
			return false
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   722
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   723
	end
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   724
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   725
	-- // COMPAT // --
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   726
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   727
	handler.getIp = handler.ip
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   728
	handler.getPort = handler.clientport
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   729
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   730
	socketlist[ socket ] = handler
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   731
	readlen = readlen + 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   732
	readlist[ readlen ] = socket
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   733
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   734
	return handler, socket
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   735
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   736
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   737
addtimer = function( listener )
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   738
	timelistener[ #timelistener + 1 ] = listener
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   739
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   740
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   741
firetimer = function( listener )
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   742
	for i, listener in ipairs( timelistener ) do
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   743
		listener( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   744
	end
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   745
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   746
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   747
addserver = function( listeners, port, addr, mode, sslctx )    -- this function provides a way for other scripts to reg a server
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   748
	local err
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   749
	if type( listeners ) ~= "table" then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   750
		err = "invalid listener table"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   751
	else
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   752
		for name, func in pairs( listeners ) do
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   753
			if type( func ) ~= "function" then
98
3a2d327c4856 server.lua should degrade gracefully when LuaSec not present
Matthew Wild <mwild1@gmail.com>
parents: 74
diff changeset
   754
				--err = "invalid listener function"
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   755
				break
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   756
			end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   757
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   758
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   759
	if not type( port ) == "number" or not ( port >= 0 and port <= 65535 ) then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   760
		err = "invalid port"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   761
	elseif listener[ port ] then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   762
		err=  "listeners on port '" .. port .. "' already exist"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   763
	elseif sslctx and not luasec then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   764
		err = "luasec not found"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   765
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   766
	if err then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   767
		out_error( "server.lua: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   768
		return nil, err
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   769
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   770
	addr = addr or "*"
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   771
	local server, err = socket_bind( addr, port )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   772
	if err then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   773
		out_error( "server.lua: ", err )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   774
		return nil, err
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   775
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   776
	local handler, err = wrapserver( listeners, server, addr, port, mode, sslctx )    -- wrap new server socket
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   777
	if not handler then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   778
		server:close( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   779
		return nil, err
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   780
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   781
	server:settimeout( 0 )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   782
	readlen = readlen + 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   783
	readlist[ readlen ] = server
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   784
	listener[ port ] = listeners
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   785
	socketlist[ server ] = handler
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   786
	out_put( "server.lua: new server listener on ", addr, ":", port )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   787
	return true
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   788
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   789
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   790
removesocket = function( tbl, socket, len )    -- this function removes sockets from a list
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   791
	for i, target in ipairs( tbl ) do
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   792
		if target == socket then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   793
			len = len - 1
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   794
			table_remove( tbl, i )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   795
			return len
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   796
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   797
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   798
	return len
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   799
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   800
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   801
closeall = function( )
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   802
	for sock, handler in pairs( socketlist ) do
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   803
		handler.shutdown( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   804
		handler.close( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   805
		socketlist[ sock ] = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   806
	end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   807
	writelist, readlist, socketlist = { }, { }, { }
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   808
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   809
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   810
closesocket = function( socket )
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   811
	writelen = removesocket( writelist, socket, writelen )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   812
	readlen = removesocket( readlist, socket, readlen )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   813
	socketlist[ socket ] = nil
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   814
	socket:close( )
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   815
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   816
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   817
loop = function( )    -- this is the main loop of the program
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   818
	--signal_set( "hub", "run" )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   819
	repeat
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   820
		--[[print(readlen, writelen)
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   821
		for _, s in ipairs(readlist) do print("R:", tostring(s)) end
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   822
		for _, s in ipairs(writelist) do print("W:", tostring(s)) end
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
   823
		out_put("select()"..os.time())]]
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   824
		local read, write, err = socket_select( readlist, writelist, 1 )    -- 1 sec timeout, nice for timers
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   825
		for i, socket in ipairs( write ) do    -- send data waiting in writequeues
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   826
			local handler = socketlist[ socket ]
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   827
			if handler then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   828
				handler.dispatchdata( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   829
			else
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   830
				closesocket( socket )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   831
				out_put "server.lua: found no handler and closed socket (writelist)"    -- this should not happen
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   832
			end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   833
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   834
		for i, socket in ipairs( read ) do    -- receive data
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   835
			local handler = socketlist[ socket ]
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   836
			if handler then
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   837
				handler.receivedata( )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   838
			else
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   839
				closesocket( socket )
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   840
				out_put "server.lua: found no handler and closed socket (readlist)"    -- this can happen
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   841
			end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   842
		end
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   843
		firetimer( )
65
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   844
	until false
9c471840acb9 TLS: Handshake works, no data after that
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
   845
	return
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   846
end
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   847
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   848
----------------------------------// BEGIN //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   849
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   850
----------------------------------// PUBLIC INTERFACE //--
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   851
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   852
return {
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   853
64
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   854
	add = addserver,
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   855
	loop = loop,
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   856
	stats = stats,
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   857
	closeall = closeall,
bcd0a3975580 Convert spaces->tabs
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
   858
	addtimer = addtimer,
127
93f3c6b94c75 Initial s2s stuff
Matthew Wild <mwild1@gmail.com>
parents: 98
diff changeset
   859
	wraptlsclient = wraptlsclient,
1
b8787e859fd2 Switched to new connection framework, courtesy of the luadch project
matthew
parents:
diff changeset
   860
}