Comparison

net/server.lua @ 2057:ee2929e620bb

server.lua: Add addsocket(), refactor all code to use it, fixes nasty socket object leak - moral of the story is to not duplicate code, and not prematurely optimise. But you knew that already didn't you?
author Matthew Wild <mwild1@gmail.com>
date Mon, 26 Oct 2009 23:29:04 +0000
parent 1979:52ddaa2e6ab8
child 2059:d4fb80b60c65
comparison
equal deleted inserted replaced
2050:adc1b92b8c6b 2057:ee2929e620bb
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
409 elseif socket and not _sendlist[ socket ] then 409 elseif socket and not _sendlist[ socket ] then
410 _sendlistlen = _sendlistlen + 1 410 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen)
411 _sendlist[ _sendlistlen ] = socket
412 _sendlist[ socket ] = _sendlistlen
413 end 411 end
414 bufferqueuelen = bufferqueuelen + 1 412 bufferqueuelen = bufferqueuelen + 1
415 bufferqueue[ bufferqueuelen ] = data 413 bufferqueue[ bufferqueuelen ] = data
416 if handler then 414 if handler then
417 _writetimes[ handler ] = _writetimes[ handler ] or _currenttime 415 _writetimes[ handler ] = _writetimes[ handler ] or _currenttime
455 end 453 end
456 elseif switch == false then 454 elseif switch == false then
457 handler.write = write 455 handler.write = write
458 if noread then 456 if noread then
459 noread = false 457 noread = false
460 _readlistlen = _readlistlen + 1 458 _readlistlen = addsocket(_readlist, socket, _readlistlen)
461 _readlist[ socket ] = _readlistlen
462 _readlist[ _readlistlen ] = socket
463 _readtimes[ handler ] = _currenttime 459 _readtimes[ handler ] = _currenttime
464 end 460 end
465 if nosend then 461 if nosend then
466 nosend = false 462 nosend = false
467 write( "" ) 463 write( "" )
548 if not err then 544 if not err then
549 out_put( "server.lua: ssl handshake done" ) 545 out_put( "server.lua: ssl handshake done" )
550 handler.readbuffer = _readbuffer -- when handshake is done, replace the handshake function with regular functions 546 handler.readbuffer = _readbuffer -- when handshake is done, replace the handshake function with regular functions
551 handler.sendbuffer = _sendbuffer 547 handler.sendbuffer = _sendbuffer
552 _ = status and status( handler, "ssl-handshake-complete" ) 548 _ = status and status( handler, "ssl-handshake-complete" )
549 _readlistlen = addsocket(_readlist, socket, _readlistlen)
553 return true 550 return true
554 else 551 else
555 out_put( "server.lua: error during ssl handshake: ", tostring(err) ) 552 out_put( "server.lua: error during ssl handshake: ", tostring(err) )
556 if err == "wantwrite" and not wrote then 553 if err == "wantwrite" and not wrote then
557 _sendlistlen = _sendlistlen + 1 554 _sendlistlen = addsocket(_sendlist, client, _sendlistlen)
558 _sendlist[ _sendlistlen ] = client
559 wrote = true 555 wrote = true
560 elseif err == "wantread" and not read then 556 elseif err == "wantread" and not read then
561 _readlistlen = _readlistlen + 1 557 _readlistlen = addsocket(_readlist, client, _readlistlen)
562 _readlist [ _readlistlen ] = client
563 read = true 558 read = true
564 else 559 else
565 break; 560 break;
566 end 561 end
567 --coroutine_yield( handler, nil, err ) -- handshake not finished 562 --coroutine_yield( handler, nil, err ) -- handshake not finished
617 send = socket.send 612 send = socket.send
618 receive = socket.receive 613 receive = socket.receive
619 shutdown = id 614 shutdown = id
620 615
621 _socketlist[ socket ] = handler 616 _socketlist[ socket ] = handler
622 _readlistlen = _readlistlen + 1 617 _readlistlen = addsocket(_readlist, socket, _readlistlen)
623 _readlist[ _readlistlen ] = socket
624 _readlist[ socket ] = _readlistlen
625 618
626 -- remove traces of the old socket 619 -- remove traces of the old socket
627 620
628 _readlistlen = removesocket( _readlist, oldsocket, _readlistlen ) 621 _readlistlen = removesocket( _readlist, oldsocket, _readlistlen )
629 _sendlistlen = removesocket( _sendlist, oldsocket, _sendlistlen ) 622 _sendlistlen = removesocket( _sendlist, oldsocket, _sendlistlen )
651 send = socket.send 644 send = socket.send
652 receive = socket.receive 645 receive = socket.receive
653 shutdown = ( ssl and id ) or socket.shutdown 646 shutdown = ( ssl and id ) or socket.shutdown
654 647
655 _socketlist[ socket ] = handler 648 _socketlist[ socket ] = handler
656 _readlistlen = _readlistlen + 1 649 _readlistlen = addsocket(_readlist, socket, _readlistlen)
657 _readlist[ _readlistlen ] = socket
658 _readlist[ socket ] = _readlistlen
659 650
660 return handler, socket 651 return handler, socket
661 end 652 end
662 653
663 id = function( ) 654 id = function( )
664 end 655 end
665 656
666 idfalse = function( ) 657 idfalse = function( )
667 return false 658 return false
659 end
660
661 addsocket = function( list, socket, len )
662 if not list[ socket ] then
663 len = len + 1
664 list[ len ] = socket
665 list[ socket ] = len
666 end
667 return len;
668 end 668 end
669 669
670 removesocket = function( list, socket, len ) -- this function removes sockets from a list ( copied from copas ) 670 removesocket = function( list, socket, len ) -- this function removes sockets from a list ( copied from copas )
671 local pos = list[ socket ] 671 local pos = list[ socket ]
672 if pos then 672 if pos then
719 if not handler then 719 if not handler then
720 server:close( ) 720 server:close( )
721 return nil, err 721 return nil, err
722 end 722 end
723 server:settimeout( 0 ) 723 server:settimeout( 0 )
724 _readlistlen = _readlistlen + 1 724 _readlistlen = addsocket(_readlist, server, _readlistlen)
725 _readlist[ _readlistlen ] = server
726 _server[ port ] = handler 725 _server[ port ] = handler
727 _socketlist[ server ] = handler 726 _socketlist[ server ] = handler
728 out_put( "server.lua: new server listener on '", addr, ":", port, "'" ) 727 out_put( "server.lua: new server listener on '", addr, ":", port, "'" )
729 return handler 728 return handler
730 end 729 end
842 --// EXPERIMENTAL //-- 841 --// EXPERIMENTAL //--
843 842
844 local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx, startssl ) 843 local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx, startssl )
845 local handler = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx, startssl ) 844 local handler = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx, startssl )
846 _socketlist[ socket ] = handler 845 _socketlist[ socket ] = handler
847 _sendlistlen = _sendlistlen + 1 846 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen)
848 _sendlist[ _sendlistlen ] = socket
849 _sendlist[ socket ] = _sendlistlen
850 return handler, socket 847 return handler, socket
851 end 848 end
852 849
853 local addclient = function( address, port, listeners, pattern, sslctx, startssl ) 850 local addclient = function( address, port, listeners, pattern, sslctx, startssl )
854 local client, err = luasocket.tcp( ) 851 local client, err = luasocket.tcp( )