Merge with trunk
[prosody.git] / net / server_event.lua
index 1a77953d2ce02d5c7c1d755aa833942c73f6882f..b467a84dc6c147e6f8ca034fb1e0809d5dcf25a7 100644 (file)
@@ -290,7 +290,8 @@ do
        \r
        -- Public methods\r
        function interface_mt:write(data)\r
-               vdebug( "try to send data to client, id/data:", self.id, data )\r
+               if self.nowriting then return nil, "locked" end\r
+               --vdebug( "try to send data to client, id/data:", self.id, data )\r
                data = tostring( data )\r
                local len = string_len( data )\r
                local total = len + self.writebufferlen\r
@@ -308,6 +309,7 @@ do
                return true\r
        end\r
        function interface_mt:close(now)\r
+               if self.nointerface then return nil, "locked"; end\r
                debug( "try to close client connection with id:", self.id )\r
                if self.type == "client" then\r
                        self.fatalerror = "client to close"\r
@@ -370,7 +372,9 @@ do
                return self.addr\r
        end\r
        \r
-                       \r
+       function interface_mt:set_sslctx(sslctx)\r
+               self._sslctx = sslctx;\r
+       end\r
        \r
        function interface_mt:starttls()\r
                debug( "try to start ssl at client id:", self.id )\r
@@ -386,6 +390,7 @@ do
                end\r
                self._usingssl = true\r
                self.startsslcallback = function( )  -- we have to start the handshake outside of a read/write event\r
+                       self.startsslcallback = nil\r
                        self:_start_ssl();\r
                        self.eventstarthandshake = nil\r
                        return -1\r
@@ -470,7 +475,7 @@ do
                                                interface.eventwritetimeout = false\r
                                        end\r
                                end\r
-                               local succ, err, byte = interface.send( interface.conn, interface.writebuffer, 1, interface.writebufferlen )\r
+                               local succ, err, byte = interface.conn:send( interface.writebuffer, 1, interface.writebufferlen )\r
                                --vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte )\r
                                if succ then  -- writing succesful\r
                                        interface.writebuffer = ""\r
@@ -511,7 +516,7 @@ do
                                end\r
                        end\r
                end\r
-               local usingssl, receive = interface._usingssl, interface.receive;\r
+               \r
                interface.readcallback = function( event )  -- called on read events\r
                        --vdebug( "new client read event, id/ip/port:", interface, ip, port )\r
                        if interface.noreading or interface.fatalerror then  -- leave this event\r
@@ -526,7 +531,7 @@ do
                                interface.eventread = nil\r
                                return -1\r
                        else -- can read\r
-                               if usingssl then  -- handle luasec\r
+                               if interface._usingssl then  -- handle luasec\r
                                        if interface.eventwritetimeout then  -- ok, in the past writecallback was regged\r
                                                local ret = interface.writecallback( )  -- call it\r
                                                --vdebug( "tried to write in readcallback, result:", ret )\r
@@ -536,8 +541,8 @@ do
                                                interface.eventreadtimeout = nil\r
                                        end\r
                                end\r
-                               local buffer, err, part = receive( client, pattern )  -- receive buffer with "pattern"\r
-                               --vdebug( "read data:", buffer, "error:", err, "part:", part )        \r
+                               local buffer, err, part = interface.conn:receive( pattern )  -- receive buffer with "pattern"\r
+                               --vdebug( "read data:", tostring(buffer), "error:", tostring(err), "part:", tostring(part) )        \r
                                buffer = buffer or part or ""\r
                                local len = string_len( buffer )\r
                                if len > cfg.MAX_READ_LENGTH then  -- check buffer length\r
@@ -547,7 +552,7 @@ do
                                        interface.eventread = nil\r
                                        return -1\r
                                end\r
-                               if err and ( "timeout" ~= err ) then\r
+                               if err and ( err ~= "timeout" and err ~= "wantread" ) then\r
                                        if "wantwrite" == err then -- need to read on write event\r
                                                if not interface.eventwrite then  -- register new write event if needed\r
                                                        interface.eventwrite = addevent( base, interface.conn, EV_WRITE, interface.writecallback, cfg.WRITE_TIMEOUT )\r