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