41 local require = use "require" |
41 local require = use "require" |
42 local tostring = use "tostring" |
42 local tostring = use "tostring" |
43 local coroutine = use "coroutine" |
43 local coroutine = use "coroutine" |
44 local setmetatable = use "setmetatable" |
44 local setmetatable = use "setmetatable" |
45 |
45 |
46 local ssl = use "ssl" or require "ssl" |
46 local ssl = use "ssl" |
47 local socket = use "socket" or require "socket" |
47 local socket = use "socket" or require "socket" |
48 |
48 |
49 local log = require ("util.logger").init("socket") |
49 local log = require ("util.logger").init("socket") |
50 |
50 |
51 local function debug(...) |
51 local function debug(...) |
140 self.fatalerror = "connection timeout" |
140 self.fatalerror = "connection timeout" |
141 self:ontimeout() -- call timeout listener |
141 self:ontimeout() -- call timeout listener |
142 self:_close() |
142 self:_close() |
143 debug( "new connection failed. id:", self.id, "error:", self.fatalerror ) |
143 debug( "new connection failed. id:", self.id, "error:", self.fatalerror ) |
144 else |
144 else |
145 if plainssl then -- start ssl session |
145 if plainssl and ssl then -- start ssl session |
146 self:starttls() |
146 self:starttls() |
147 else -- normal connection |
147 else -- normal connection |
148 self:_start_session( self.listener.onconnect ) |
148 self:_start_session( self.listener.onconnect ) |
149 end |
149 end |
150 debug( "new connection established. id:", self.id ) |
150 debug( "new connection established. id:", self.id ) |
487 _ip = ip, _port = port, _server = server, _pattern = pattern, |
487 _ip = ip, _port = port, _server = server, _pattern = pattern, |
488 _serverport = (server and server:port() or nil), |
488 _serverport = (server and server:port() or nil), |
489 _sslctx = sslctx; -- parameters |
489 _sslctx = sslctx; -- parameters |
490 _usingssl = false; -- client is using ssl; |
490 _usingssl = false; -- client is using ssl; |
491 } |
491 } |
|
492 if not ssl then interface.starttls = false; end |
492 interface.id = tostring(interface):match("%x+$"); |
493 interface.id = tostring(interface):match("%x+$"); |
493 interface.writecallback = function( event ) -- called on write events |
494 interface.writecallback = function( event ) -- called on write events |
494 --vdebug( "new client write event, id/ip/port:", interface, ip, port ) |
495 --vdebug( "new client write event, id/ip/port:", interface, ip, port ) |
495 if interface.nowriting or ( interface.fatalerror and ( "client to close" ~= interface.fatalerror ) ) then -- leave this event |
496 if interface.nowriting or ( interface.fatalerror and ( "client to close" ~= interface.fatalerror ) ) then -- leave this event |
496 --vdebug( "leaving this event because:", interface.nowriting or interface.fatalerror ) |
497 --vdebug( "leaving this event because:", interface.nowriting or interface.fatalerror ) |
668 end |
669 end |
669 local ip, port = client:getpeername( ) |
670 local ip, port = client:getpeername( ) |
670 interface._connections = interface._connections + 1 -- increase connection count |
671 interface._connections = interface._connections + 1 -- increase connection count |
671 local clientinterface = handleclient( client, ip, port, interface, pattern, listener, nil, sslctx ) |
672 local clientinterface = handleclient( client, ip, port, interface, pattern, listener, nil, sslctx ) |
672 --vdebug( "client id:", clientinterface, "startssl:", startssl ) |
673 --vdebug( "client id:", clientinterface, "startssl:", startssl ) |
673 if sslctx then |
674 if ssl and sslctx then |
674 clientinterface:starttls(sslctx) |
675 clientinterface:starttls(sslctx) |
675 else |
676 else |
676 clientinterface:_start_session( clientinterface.onconnect ) |
677 clientinterface:_start_session( clientinterface.onconnect ) |
677 end |
678 end |
678 debug( "accepted incoming client connection from:", ip, port ) |
679 debug( "accepted incoming client connection from:", ip, port ) |