return self:_destroy();
end
-function interface_mt:_start_connection(plainssl) -- should be called from addclient
+function interface_mt:_start_connection(plainssl) -- called from wrapclient
local callback = function( event )
if EV_TIMEOUT == event then -- timeout during connection
self.fatalerror = "connection timeout"
function interface_mt:resume()
self:_lock(self.nointerface, false, self.nowriting);
- if not self.eventread then
+ if self.readcallback and not self.eventread then
self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT ); -- register callback
+ return true;
end
end
if not self.eventwrite then
self:_lock( true, true, true ) -- lock the interface, to not disturb the handshake
self.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, self.startsslcallback, 0 ) -- add event to start handshake
- else -- wait until writebuffer is empty
- self:_lock( true, true, false )
- debug "ssl session delayed until writebuffer is empty..."
-end
-self.starttls = false;
-return true
+ else
+ -- wait until writebuffer is empty
+ self:_lock( true, true, false )
+ debug "ssl session delayed until writebuffer is empty..."
+ end
+ self.starttls = false;
+ return true
end
function interface_mt:setoption(option, value)
function interface_mt:setlistener(listener)
self:ondetach(); -- Notify listener that it is no longer responsible for this connection
- self.onconnect, self.ondisconnect, self.onincoming, self.ontimeout,
- self.onreadtimeout, self.onstatus, self.ondetach
- = listener.onconnect, listener.ondisconnect, listener.onincoming, listener.ontimeout,
- listener.onreadtimeout, listener.onstatus, listener.ondetach;
+ self.onconnect = listener.onconnect;
+ self.ondisconnect = listener.ondisconnect;
+ self.onincoming = listener.onincoming;
+ self.ontimeout = listener.ontimeout;
+ self.onreadtimeout = listener.onreadtimeout;
+ self.onstatus = listener.onstatus;
+ self.ondetach = listener.ondetach;
end
-- Stub handlers
elseif interface.startsslcallback then -- start ssl connection if needed
debug "starting ssl handshake after writing"
interface.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, interface.startsslcallback, 0 )
+ elseif interface.writebufferlen ~= 0 then
+ -- data possibly written from ondrain
+ return EV_WRITE, cfg.WRITE_TIMEOUT
elseif interface.eventreadtimeout then
- return EV_WRITE, EV_TIMEOUT
+ return EV_WRITE, cfg.WRITE_TIMEOUT
end
interface.eventwrite = nil
return -1
interface.eventwrite = addevent( base, interface.conn, EV_WRITE, interface.writecallback, cfg.WRITE_TIMEOUT )
end
interface.eventreadtimeout = addevent( base, nil, EV_TIMEOUT,
- function( )
- interface:_close()
- end, cfg.READ_TIMEOUT
- )
+ function( ) interface:_close() end, cfg.READ_TIMEOUT)
debug( "wantwrite during read attempt, reg it in writecallback but dont know what really happens next..." )
-- to be honest i dont know what happens next, if it is allowed to first read, the write etc...
else -- connection was closed or fatal error
local interface = {
_connections = 0;
+ type = "server";
conn = server;
onconnect = listener.onconnect; -- will be called when new client connected
eventread = false; -- read event handler
if res or ( err == "timeout" ) then
local ip, port = client:getsockname( )
local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx )
- interface:_start_connection( sslctx )
debug( "new connection id:", interface.id )
return interface, err
else