X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=net%2Fserver.lua;h=54eadbc617b9f0c06861b2d69dca4681ddbdc696;hb=f7f712f889b15132b3466806f337df7a9a427010;hp=65567d158df5666e47752ed79ca41fdb5a97cff3;hpb=decfa9a9ae6e0e976f6aef5df0b4ac00e57f237f;p=prosody.git diff --git a/net/server.lua b/net/server.lua index 65567d15..54eadbc6 100644 --- a/net/server.lua +++ b/net/server.lua @@ -157,6 +157,7 @@ _cleanqueue = false -- clean bufferqueue after using _maxclientsperserver = 1000 +_maxsslhandshake = 30 -- max handshake round-trips ----------------------------------// PRIVATE //-- wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx, maxconnections, startssl ) -- this function wraps a server @@ -230,6 +231,9 @@ wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx, maxco handler.ssl = function( ) return ssl end + handler.sslctx = function( ) + return sslctx + end handler.remove = function( ) connections = connections - 1 end @@ -297,6 +301,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport local ssl local dispatch = listeners.incoming or listeners.listener + local status = listeners.status local disconnect = listeners.disconnect local bufferqueue = { } -- buffer array @@ -336,6 +341,9 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport handler.ssl = function( ) return ssl end + handler.sslctx = function ( ) + return sslctx + end handler.send = function( _, data, i, j ) return send( socket, data, i, j ) end @@ -363,6 +371,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport send( socket, table_concat( bufferqueue, "", 1, bufferqueuelen ), 1, bufferlen ) -- forced send end end + if not handler then return true; end _ = shutdown and shutdown( socket ) socket:close( ) _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) @@ -472,10 +481,10 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport readtraffic = readtraffic + count _readtraffic = _readtraffic + count _readtimes[ handler ] = _currenttime - --out_put( "server.lua: read data '", buffer, "', error: ", err ) + --out_put( "server.lua: read data '", buffer:gsub("[^%w%p ]", "."), "', error: ", err ) return dispatch( handler, buffer, err ) else -- connections was closed or fatal error - out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " error: ", tostring(err) ) + out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " read error: ", tostring(err) ) fatalerror = true disconnect( handler, err ) _ = handler and handler.close( ) @@ -512,7 +521,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport _writetimes[ handler ] = _currenttime return true else -- connection was closed during sending or fatal error - out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " error: ", tostring(err) ) + out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " write error: ", tostring(err) ) fatalerror = true disconnect( handler, err ) _ = handler and handler.close( ) @@ -526,7 +535,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport local read local handshake = coroutine_wrap( function( client ) -- create handshake coroutine local err - for i = 1, 10 do -- 10 handshake attemps + for i = 1, _maxsslhandshake do _sendlistlen = ( wrote and removesocket( _sendlist, socket, _sendlistlen ) ) or _sendlistlen _readlistlen = ( read and removesocket( _readlist, socket, _readlistlen ) ) or _readlistlen read, wrote = nil, nil @@ -535,7 +544,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport out_put( "server.lua: ssl handshake done" ) handler.readbuffer = _readbuffer -- when handshake is done, replace the handshake function with regular functions handler.sendbuffer = _sendbuffer - -- return dispatch( handler ) + _ = status and status( handler, "ssl-handshake-complete" ) return true else out_put( "server.lua: error during ssl handshake: ", tostring(err) ) @@ -719,7 +728,7 @@ end removeserver = function( port ) local handler = _server[ port ] if not handler then - return nil, "no server found on port '" .. tostring( port ) "'" + return nil, "no server found on port '" .. tostring( port ) .. "'" end handler.close( ) _server[ port ] = nil @@ -743,7 +752,7 @@ closeall = function( ) end getsettings = function( ) - return _selecttimeout, _sleeptime, _maxsendlen, _maxreadlen, _checkinterval, _sendtimeout, _readtimeout, _cleanqueue, _maxclientsperserver + return _selecttimeout, _sleeptime, _maxsendlen, _maxreadlen, _checkinterval, _sendtimeout, _readtimeout, _cleanqueue, _maxclientsperserver, _maxsslhandshake end changesettings = function( new ) @@ -759,6 +768,7 @@ changesettings = function( new ) _readtimeout = tonumber( new.readtimeout ) or _readtimeout _cleanqueue = new.cleanqueue _maxclientsperserver = new._maxclientsperserver or _maxclientsperserver + _maxsslhandshake = new._maxsslhandshake or _maxsslhandshake return true end @@ -811,7 +821,7 @@ loop = function( ) -- this is the main loop of the program _currenttime = os_time( ) if os_difftime( _currenttime - _timer ) >= 1 then for i = 1, _timerlistlen do - _timerlist[ i ]( ) -- fire timers + _timerlist[ i ]( _currenttime ) -- fire timers end _timer = _currenttime end