Mercurial > prosody-hg
comparison net/server_select.lua @ 2131:72411e239221
net.server_select: Bring up to date to new common connection API
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 22 Nov 2009 04:45:13 +0000 |
| parents | 0dc5eb9dbb62 |
| children | 459c1d1cae95 |
comparison
equal
deleted
inserted
replaced
| 2130:828e161cdfc7 | 2131:72411e239221 |
|---|---|
| 164 | 164 |
| 165 maxconnections = maxconnections or _maxclientsperserver | 165 maxconnections = maxconnections or _maxclientsperserver |
| 166 | 166 |
| 167 local connections = 0 | 167 local connections = 0 |
| 168 | 168 |
| 169 local dispatch, disconnect = listeners.incoming or listeners.listener, listeners.disconnect | 169 local dispatch, disconnect = listeners.onincoming, listeners.ondisconnect |
| 170 | 170 |
| 171 local err | 171 local err |
| 172 | 172 |
| 173 local ssl = false | 173 local ssl = false |
| 174 | 174 |
| 239 end | 239 end |
| 240 handler.close = function( ) | 240 handler.close = function( ) |
| 241 for _, handler in pairs( _socketlist ) do | 241 for _, handler in pairs( _socketlist ) do |
| 242 if handler.serverport == serverport then | 242 if handler.serverport == serverport then |
| 243 handler.disconnect( handler, "server closed" ) | 243 handler.disconnect( handler, "server closed" ) |
| 244 handler.close( true ) | 244 handler:close( true ) |
| 245 end | 245 end |
| 246 end | 246 end |
| 247 socket:close( ) | 247 socket:close( ) |
| 248 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) | 248 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) |
| 249 _readlistlen = removesocket( _readlist, socket, _readlistlen ) | 249 _readlistlen = removesocket( _readlist, socket, _readlistlen ) |
| 298 | 298 |
| 299 --// private closures of the object //-- | 299 --// private closures of the object //-- |
| 300 | 300 |
| 301 local ssl | 301 local ssl |
| 302 | 302 |
| 303 local dispatch = listeners.incoming or listeners.listener | 303 local dispatch = listeners.onincoming |
| 304 local status = listeners.status | 304 local status = listeners.status |
| 305 local disconnect = listeners.disconnect | 305 local disconnect = listeners.ondisconnect |
| 306 | 306 |
| 307 local bufferqueue = { } -- buffer array | 307 local bufferqueue = { } -- buffer array |
| 308 local bufferqueuelen = 0 -- end of buffer array | 308 local bufferqueuelen = 0 -- end of buffer array |
| 309 | 309 |
| 310 local toclose | 310 local toclose |
| 329 return dispatch | 329 return dispatch |
| 330 end | 330 end |
| 331 handler.disconnect = function( ) | 331 handler.disconnect = function( ) |
| 332 return disconnect | 332 return disconnect |
| 333 end | 333 end |
| 334 handler.setlistener = function( listeners ) | 334 handler.setlistener = function( self, listeners ) |
| 335 dispatch = listeners.incoming | 335 dispatch = listeners.onincoming |
| 336 disconnect = listeners.disconnect | 336 disconnect = listeners.ondisconnect |
| 337 end | 337 end |
| 338 handler.getstats = function( ) | 338 handler.getstats = function( ) |
| 339 return readtraffic, sendtraffic | 339 return readtraffic, sendtraffic |
| 340 end | 340 end |
| 341 handler.ssl = function( ) | 341 handler.ssl = function( ) |
| 398 return serverport | 398 return serverport |
| 399 end | 399 end |
| 400 handler.clientport = function( ) | 400 handler.clientport = function( ) |
| 401 return clientport | 401 return clientport |
| 402 end | 402 end |
| 403 local write = function( data ) | 403 local write = function( self, data ) |
| 404 bufferlen = bufferlen + string_len( data ) | 404 bufferlen = bufferlen + string_len( data ) |
| 405 if bufferlen > maxsendlen then | 405 if bufferlen > maxsendlen then |
| 406 _closelist[ handler ] = "send buffer exceeded" -- cannot close the client at the moment, have to wait to the end of the cycle | 406 _closelist[ handler ] = "send buffer exceeded" -- cannot close the client at the moment, have to wait to the end of the cycle |
| 407 handler.write = idfalse -- dont write anymore | 407 handler.write = idfalse -- dont write anymore |
| 408 return false | 408 return false |
| 415 _writetimes[ handler ] = _writetimes[ handler ] or _currenttime | 415 _writetimes[ handler ] = _writetimes[ handler ] or _currenttime |
| 416 end | 416 end |
| 417 return true | 417 return true |
| 418 end | 418 end |
| 419 handler.write = write | 419 handler.write = write |
| 420 handler.bufferqueue = function( ) | 420 handler.bufferqueue = function( self ) |
| 421 return bufferqueue | 421 return bufferqueue |
| 422 end | 422 end |
| 423 handler.socket = function( ) | 423 handler.socket = function( self ) |
| 424 return socket | 424 return socket |
| 425 end | 425 end |
| 426 handler.pattern = function( new ) | 426 handler.pattern = function( self, new ) |
| 427 pattern = new or pattern | 427 pattern = new or pattern |
| 428 return pattern | 428 return pattern |
| 429 end | 429 end |
| 430 handler.setsend = function ( newsend ) | 430 handler.setsend = function ( self, newsend ) |
| 431 send = newsend or send | 431 send = newsend or send |
| 432 return send | 432 return send |
| 433 end | 433 end |
| 434 handler.bufferlen = function( readlen, sendlen ) | 434 handler.bufferlen = function( self, readlen, sendlen ) |
| 435 maxsendlen = sendlen or maxsendlen | 435 maxsendlen = sendlen or maxsendlen |
| 436 maxreadlen = readlen or maxreadlen | 436 maxreadlen = readlen or maxreadlen |
| 437 return maxreadlen, maxsendlen | 437 return maxreadlen, maxsendlen |
| 438 end | 438 end |
| 439 handler.lock = function( switch ) | 439 handler.lock = function( self, switch ) |
| 440 if switch == true then | 440 if switch == true then |
| 441 handler.write = idfalse | 441 handler.write = idfalse |
| 442 local tmp = _sendlistlen | 442 local tmp = _sendlistlen |
| 443 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) | 443 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) |
| 444 _writetimes[ handler ] = nil | 444 _writetimes[ handler ] = nil |
| 505 end | 505 end |
| 506 if succ then -- sending succesful | 506 if succ then -- sending succesful |
| 507 bufferqueuelen = 0 | 507 bufferqueuelen = 0 |
| 508 bufferlen = 0 | 508 bufferlen = 0 |
| 509 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist | 509 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist |
| 510 _ = needtls and handler.starttls(true) | 510 _ = needtls and handler:starttls(true) |
| 511 _writetimes[ handler ] = nil | 511 _writetimes[ handler ] = nil |
| 512 _ = toclose and handler.close( ) | 512 _ = toclose and handler.close( ) |
| 513 return true | 513 return true |
| 514 elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write | 514 elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write |
| 515 buffer = string_sub( buffer, byte + 1, bufferlen ) -- new buffer | 515 buffer = string_sub( buffer, byte + 1, bufferlen ) -- new buffer |
| 527 end | 527 end |
| 528 end | 528 end |
| 529 | 529 |
| 530 -- Set the sslctx | 530 -- Set the sslctx |
| 531 local handshake; | 531 local handshake; |
| 532 function handler.set_sslctx(new_sslctx) | 532 function handler.set_sslctx(self, new_sslctx) |
| 533 ssl = true | 533 ssl = true |
| 534 sslctx = new_sslctx; | 534 sslctx = new_sslctx; |
| 535 local wrote | 535 local wrote |
| 536 local read | 536 local read |
| 537 handshake = coroutine_wrap( function( client ) -- create handshake coroutine | 537 handshake = coroutine_wrap( function( client ) -- create handshake coroutine |
| 562 --coroutine_yield( handler, nil, err ) -- handshake not finished | 562 --coroutine_yield( handler, nil, err ) -- handshake not finished |
| 563 coroutine_yield( ) | 563 coroutine_yield( ) |
| 564 end | 564 end |
| 565 end | 565 end |
| 566 disconnect( handler, "ssl handshake failed" ) | 566 disconnect( handler, "ssl handshake failed" ) |
| 567 _ = handler and handler.close( true ) -- forced disconnect | 567 _ = handler and handler:close( true ) -- forced disconnect |
| 568 return false -- handshake failed | 568 return false -- handshake failed |
| 569 end | 569 end |
| 570 ) | 570 ) |
| 571 end | 571 end |
| 572 if sslctx then -- ssl? | 572 if sslctx then -- ssl? |
| 573 handler.set_sslctx(sslctx); | 573 handler:set_sslctx(sslctx); |
| 574 if startssl then -- ssl now? | 574 if startssl then -- ssl now? |
| 575 --out_put("server.lua: ", "starting ssl handshake") | 575 --out_put("server.lua: ", "starting ssl handshake") |
| 576 local err | 576 local err |
| 577 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket | 577 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket |
| 578 if err then | 578 if err then |
| 588 return nil, nil, "ssl handshake failed"; | 588 return nil, nil, "ssl handshake failed"; |
| 589 end | 589 end |
| 590 else | 590 else |
| 591 -- We're not automatically doing SSL, so we're not secure (yet) | 591 -- We're not automatically doing SSL, so we're not secure (yet) |
| 592 ssl = false | 592 ssl = false |
| 593 handler.starttls = function( now ) | 593 handler.starttls = function( self, now ) |
| 594 if not now then | 594 if not now then |
| 595 --out_put "server.lua: we need to do tls, but delaying until later" | 595 --out_put "server.lua: we need to do tls, but delaying until later" |
| 596 needtls = true | 596 needtls = true |
| 597 return | 597 return |
| 598 end | 598 end |
| 735 removeserver = function( port ) | 735 removeserver = function( port ) |
| 736 local handler = _server[ port ] | 736 local handler = _server[ port ] |
| 737 if not handler then | 737 if not handler then |
| 738 return nil, "no server found on port '" .. tostring( port ) .. "'" | 738 return nil, "no server found on port '" .. tostring( port ) .. "'" |
| 739 end | 739 end |
| 740 handler.close( ) | 740 handler:close( ) |
| 741 _server[ port ] = nil | 741 _server[ port ] = nil |
| 742 return true | 742 return true |
| 743 end | 743 end |
| 744 | 744 |
| 745 closeall = function( ) | 745 closeall = function( ) |
| 746 for _, handler in pairs( _socketlist ) do | 746 for _, handler in pairs( _socketlist ) do |
| 747 handler.close( ) | 747 handler:close( ) |
| 748 _socketlist[ _ ] = nil | 748 _socketlist[ _ ] = nil |
| 749 end | 749 end |
| 750 _readlistlen = 0 | 750 _readlistlen = 0 |
| 751 _sendlistlen = 0 | 751 _sendlistlen = 0 |
| 752 _timerlistlen = 0 | 752 _timerlistlen = 0 |
| 820 out_put "server.lua: found no handler and closed socket (readlist)" -- this can happen | 820 out_put "server.lua: found no handler and closed socket (readlist)" -- this can happen |
| 821 end | 821 end |
| 822 end | 822 end |
| 823 for handler, err in pairs( _closelist ) do | 823 for handler, err in pairs( _closelist ) do |
| 824 handler.disconnect( )( handler, err ) | 824 handler.disconnect( )( handler, err ) |
| 825 handler.close( true ) -- forced disconnect | 825 handler:close( true ) -- forced disconnect |
| 826 end | 826 end |
| 827 clean( _closelist ) | 827 clean( _closelist ) |
| 828 _currenttime = os_time( ) | 828 _currenttime = os_time( ) |
| 829 if os_difftime( _currenttime - _timer ) >= 1 then | 829 if os_difftime( _currenttime - _timer ) >= 1 then |
| 830 for i = 1, _timerlistlen do | 830 for i = 1, _timerlistlen do |
| 878 _starttime = _currenttime | 878 _starttime = _currenttime |
| 879 for handler, timestamp in pairs( _writetimes ) do | 879 for handler, timestamp in pairs( _writetimes ) do |
| 880 if os_difftime( _currenttime - timestamp ) > _sendtimeout then | 880 if os_difftime( _currenttime - timestamp ) > _sendtimeout then |
| 881 --_writetimes[ handler ] = nil | 881 --_writetimes[ handler ] = nil |
| 882 handler.disconnect( )( handler, "send timeout" ) | 882 handler.disconnect( )( handler, "send timeout" ) |
| 883 handler.close( true ) -- forced disconnect | 883 handler:close( true ) -- forced disconnect |
| 884 end | 884 end |
| 885 end | 885 end |
| 886 for handler, timestamp in pairs( _readtimes ) do | 886 for handler, timestamp in pairs( _readtimes ) do |
| 887 if os_difftime( _currenttime - timestamp ) > _readtimeout then | 887 if os_difftime( _currenttime - timestamp ) > _readtimeout then |
| 888 --_readtimes[ handler ] = nil | 888 --_readtimes[ handler ] = nil |
| 889 handler.disconnect( )( handler, "read timeout" ) | 889 handler.disconnect( )( handler, "read timeout" ) |
| 890 handler.close( ) -- forced disconnect? | 890 handler:close( ) -- forced disconnect? |
| 891 end | 891 end |
| 892 end | 892 end |
| 893 end | 893 end |
| 894 end | 894 end |
| 895 ) | 895 ) |
