Directed presence
[prosody.git] / net / server.lua
index 9d178cb26860c2838d5b87162bc3f055f312452c..4e5ec366c11cf901268d851dd101645707e0a606 100644 (file)
@@ -470,9 +470,6 @@ wraptlsclient = function( listener, socket, ip, serverport, clientport, mode, ss
                        if handler.need_tls then
                                out_put("server.lua: connection is ready for tls handshake");
                                handler.starttls(true);
-                               if handler.need_tls then
-                                       out_put("server.lua: uh-oh... we still want tls, something must be wrong");
-                               end
                        end
                        return true
                elseif byte and ( err == "timeout" or err == "wantwrite" ) then    -- want write
@@ -504,13 +501,24 @@ wraptlsclient = function( listener, socket, ip, serverport, clientport, mode, ss
        handler.starttls = function (now)
                if not now then out_put("server.lua: we need to do tls, but delaying until later"); handler.need_tls = true; return; end
                out_put( "server.lua: attempting to start tls on "..tostring(socket) )
+               local oldsocket = socket;
                socket, err = ssl_wrap( socket, sslctx )    -- wrap socket
                out_put("sslwrapped socket is "..tostring(socket));
                if err then
                        out_put( "server.lua: ssl error: ", err )
                        return nil, nil, err    -- fatal error
                end
-               socket:settimeout( 1 )
+               socket:settimeout(0);
+               
+               -- Add the new socket to our system
+               socketlist[ socket ] = handler
+               readlen = readlen + 1
+               readlist[ readlen ] = socket
+               
+               -- Remove traces of the old socket
+               readlen = removesocket( readlist, oldsocket, readlen )
+               socketlist [ oldsocket ] = nil;
+               
                send = socket.send
                receive = socket.receive
                close = socket.close
@@ -525,6 +533,7 @@ wraptlsclient = function( listener, socket, ip, serverport, clientport, mode, ss
                end
                
                handler.starttls = nil;
+               handler.need_tls = nil
                
                        handler.handshake = coroutine_wrap( function( client )
                                        local err
@@ -534,11 +543,7 @@ wraptlsclient = function( listener, socket, ip, serverport, clientport, mode, ss
                                                        out_put( "server.lua: ssl handshake done" )
                                                        writelen = ( wrote and removesocket( writelist, socket, writelen ) ) or writelen
                                                        handler.receivedata = handler._receivedata    -- when handshake is done, replace the handshake function with regular functions
-                                                       handler.dispatchdata = handler._dispatchdata
-                                                       handler.need_tls = nil
-                                                       socketlist[ client ] = handler
-                                                       readlen = readlen + 1
-                                                       readlist[ readlen ] = client                                                                                            
+                                                       handler.dispatchdata = handler._dispatchdata;
                                                        return true;
                                                else
                                                        out_put( "server.lua: error during ssl handshake: ", err )
@@ -582,6 +587,8 @@ wraptcpclient = function( listener, socket, ip, serverport, clientport, mode )
 
        local eol, fatal_send_error
 
+       socket:settimeout(0);
+       
        local rstat, sstat = 0, 0
 
        --// local import of socket methods //--
@@ -793,10 +800,6 @@ end
 loop = function( )    -- this is the main loop of the program
        --signal_set( "hub", "run" )
        repeat
-               --[[print(readlen, writelen)
-               for _, s in ipairs(readlist) do print("R:", tostring(s)) end
-               for _, s in ipairs(writelist) do print("W:", tostring(s)) end
-               out_put("select()"..os.time())]]
                local read, write, err = socket_select( readlist, writelist, 1 )    -- 1 sec timeout, nice for timers
                for i, socket in ipairs( write ) do    -- send data waiting in writequeues
                        local handler = socketlist[ socket ]
@@ -832,5 +835,6 @@ return {
        stats = stats,
        closeall = closeall,
        addtimer = addtimer,
+       wraptcpclient = wraptcpclient,
        wraptlsclient = wraptlsclient,
 }