X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=net%2Fserver_event.lua;h=b467a84dc6c147e6f8ca034fb1e0809d5dcf25a7;hb=4e9ad86f42f78e32d5a983b62277a0552c853a9c;hp=23a8ff86b374ada58df61c6dac88251be087063a;hpb=e76a980aadc9ede1135d8d096cb27b67e6f28bea;p=prosody.git diff --git a/net/server_event.lua b/net/server_event.lua index 23a8ff86..b467a84d 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -161,7 +161,7 @@ do self:_lock( false, false, false ) --vdebug( "start listening on client socket with id:", self.id ) self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT ) -- register callback - onconnect( self ) + self:onconnect() self.eventsession = nil return -1 end @@ -180,7 +180,7 @@ do _ = self.eventwrite and self.eventwrite:close( ) self.eventread, self.eventwrite = nil, nil local err - self.conn, err = ssl.wrap( self.conn, self.sslctx ) + self.conn, err = ssl.wrap( self.conn, self._sslctx ) if err then self.fatalerror = err self.conn = nil -- cannot be used anymore @@ -212,16 +212,16 @@ do self.receive = self.conn.receive local onsomething if "onconnect" == arg then -- trigger listener - onsomething = self.listener.onconnect + onsomething = self.onconnect else - onsomething = self.listener.onsslconnection + onsomething = self.onsslconnection end self:_start_session( onsomething ) debug( "ssl handshake done" ) self.eventhandshake = nil return -1 end - debug( "error during ssl handshake:", err ) + debug( "error during ssl handshake:", err ) if err == "wantwrite" then event = EV_WRITE elseif err == "wantread" then @@ -275,6 +275,7 @@ do interfacelist( "delete", self ) return true end + function interface_mt:_lock(nointerface, noreading, nowriting) -- lock or unlock this interface or events self.nointerface, self.noreading, self.nowriting = nointerface, noreading, nowriting return nointerface, noreading, nowriting @@ -289,7 +290,8 @@ do -- Public methods function interface_mt:write(data) - vdebug( "try to send data to client, id/data:", self.id, data ) + if self.nowriting then return nil, "locked" end + --vdebug( "try to send data to client, id/data:", self.id, data ) data = tostring( data ) local len = string_len( data ) local total = len + self.writebufferlen @@ -307,6 +309,7 @@ do return true end function interface_mt:close(now) + if self.nointerface then return nil, "locked"; end debug( "try to close client connection with id:", self.id ) if self.type == "client" then self.fatalerror = "client to close" @@ -354,7 +357,7 @@ do end function interface_mt:ssl() - return self.usingssl + return self._usingssl end function interface_mt:type() @@ -369,22 +372,25 @@ do return self.addr end - + function interface_mt:set_sslctx(sslctx) + self._sslctx = sslctx; + end function interface_mt:starttls() debug( "try to start ssl at client id:", self.id ) local err - if not self.sslctx then -- no ssl available + if not self._sslctx then -- no ssl available err = "no ssl context available" - elseif self.usingssl then -- startssl was already called + elseif self._usingssl then -- startssl was already called err = "ssl already active" end if err then debug( "error:", err ) return nil, err end - self.usingssl = true + self._usingssl = true self.startsslcallback = function( ) -- we have to start the handshake outside of a read/write event + self.startsslcallback = nil self:_start_ssl(); self.eventstarthandshake = nil return -1 @@ -459,7 +465,7 @@ do interface.eventwrite = false return -1 else -- can write :) - if interface.usingssl then -- handle luasec + if interface._usingssl then -- handle luasec if interface.eventreadtimeout then -- we have to read first local ret = interface.readcallback( ) -- call readcallback --vdebug( "tried to read in writecallback, result:", ret ) @@ -469,7 +475,7 @@ do interface.eventwritetimeout = false end end - local succ, err, byte = interface.send( interface.conn, interface.writebuffer, 1, interface.writebufferlen ) + local succ, err, byte = interface.conn:send( interface.writebuffer, 1, interface.writebufferlen ) --vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte ) if succ then -- writing succesful interface.writebuffer = "" @@ -510,7 +516,7 @@ do end end end - local usingssl, receive = interface._usingssl, interface.receive; + interface.readcallback = function( event ) -- called on read events --vdebug( "new client read event, id/ip/port:", interface, ip, port ) if interface.noreading or interface.fatalerror then -- leave this event @@ -525,7 +531,7 @@ do interface.eventread = nil return -1 else -- can read - if usingssl then -- handle luasec + if interface._usingssl then -- handle luasec if interface.eventwritetimeout then -- ok, in the past writecallback was regged local ret = interface.writecallback( ) -- call it --vdebug( "tried to write in readcallback, result:", ret ) @@ -535,8 +541,8 @@ do interface.eventreadtimeout = nil end end - local buffer, err, part = receive( client, pattern ) -- receive buffer with "pattern" - --vdebug( "read data:", buffer, "error:", err, "part:", part ) + local buffer, err, part = interface.conn:receive( pattern ) -- receive buffer with "pattern" + --vdebug( "read data:", tostring(buffer), "error:", tostring(err), "part:", tostring(part) ) buffer = buffer or part or "" local len = string_len( buffer ) if len > cfg.MAX_READ_LENGTH then -- check buffer length @@ -546,7 +552,7 @@ do interface.eventread = nil return -1 end - if err and ( "timeout" ~= err ) then + if err and ( err ~= "timeout" and err ~= "wantread" ) then if "wantwrite" == err then -- need to read on write event if not interface.eventwrite then -- register new write event if needed interface.eventwrite = addevent( base, interface.conn, EV_WRITE, interface.writecallback, cfg.WRITE_TIMEOUT )