comparison net/server_select.lua @ 11200:bf8f2da84007

Merge 0.11->trunk
author Kim Alvefur <zash@zash.se>
date Thu, 05 Nov 2020 22:31:25 +0100
parents 988ddd57e851
children dcf38ac6a38c
comparison
equal deleted inserted replaced
11199:6c7c50a4de32 11200:bf8f2da84007
66 local stats 66 local stats
67 local idfalse 67 local idfalse
68 local closeall 68 local closeall
69 local addsocket 69 local addsocket
70 local addserver 70 local addserver
71 local listen
71 local addtimer 72 local addtimer
72 local getserver 73 local getserver
73 local wrapserver 74 local wrapserver
74 local getsettings 75 local getsettings
75 local closesocket 76 local closesocket
121 122
122 ----------------------------------// DEFINITION //-- 123 ----------------------------------// DEFINITION //--
123 124
124 _server = { } -- key = port, value = table; list of listening servers 125 _server = { } -- key = port, value = table; list of listening servers
125 _readlist = { } -- array with sockets to read from 126 _readlist = { } -- array with sockets to read from
126 _sendlist = { } -- arrary with sockets to write to 127 _sendlist = { } -- array with sockets to write to
127 _timerlist = { } -- array of timer functions 128 _timerlist = { } -- array of timer functions
128 _socketlist = { } -- key = socket, value = wrapped socket (handlers) 129 _socketlist = { } -- key = socket, value = wrapped socket (handlers)
129 _readtimes = { } -- key = handler, value = timestamp of last data reading 130 _readtimes = { } -- key = handler, value = timestamp of last data reading
130 _writetimes = { } -- key = handler, value = timestamp of last data writing/sending 131 _writetimes = { } -- key = handler, value = timestamp of last data writing/sending
131 _closelist = { } -- handlers to close 132 _closelist = { } -- handlers to close
147 148
148 _checkinterval = 30 -- interval in secs to check idle clients 149 _checkinterval = 30 -- interval in secs to check idle clients
149 _sendtimeout = 60000 -- allowed send idle time in secs 150 _sendtimeout = 60000 -- allowed send idle time in secs
150 _readtimeout = 14 * 60 -- allowed read idle time in secs 151 _readtimeout = 14 * 60 -- allowed read idle time in secs
151 152
152 local is_windows = package.config:sub(1,1) == "\\" -- check the directory separator, to detemine whether this is Windows 153 local is_windows = package.config:sub(1,1) == "\\" -- check the directory separator, to determine whether this is Windows
153 _maxfd = (is_windows and math.huge) or luasocket._SETSIZE or 1024 -- max fd number, limit to 1024 by default to prevent glibc buffer overflow, but not on Windows 154 _maxfd = (is_windows and math.huge) or luasocket._SETSIZE or 1024 -- max fd number, limit to 1024 by default to prevent glibc buffer overflow, but not on Windows
154 _maxselectlen = luasocket._SETSIZE or 1024 -- But this still applies on Windows 155 _maxselectlen = luasocket._SETSIZE or 1024 -- But this still applies on Windows
155 156
156 _maxsslhandshake = 30 -- max handshake round-trips 157 _maxsslhandshake = 30 -- max handshake round-trips
157 158
158 ----------------------------------// PRIVATE //-- 159 ----------------------------------// PRIVATE //--
159 160
160 wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx ) -- this function wraps a server -- FIXME Make sure FD < _maxfd 161 wrapserver = function( listeners, socket, ip, serverport, pattern, sslctx, ssldirect ) -- this function wraps a server -- FIXME Make sure FD < _maxfd
161 162
162 if socket:getfd() >= _maxfd then 163 if socket:getfd() >= _maxfd then
163 out_error("server.lua: Disallowed FD number: "..socket:getfd()) 164 out_error("server.lua: Disallowed FD number: "..socket:getfd())
164 socket:close() 165 socket:close()
165 return nil, "fd-too-large" 166 return nil, "fd-too-large"
181 return sslctx ~= nil 182 return sslctx ~= nil
182 end 183 end
183 handler.sslctx = function( ) 184 handler.sslctx = function( )
184 return sslctx 185 return sslctx
185 end 186 end
187 handler.hosts = {} -- sni
186 handler.remove = function( ) 188 handler.remove = function( )
187 connections = connections - 1 189 connections = connections - 1
188 if handler then 190 if handler then
189 handler.resume( ) 191 handler.resume( )
190 end 192 end
242 return false 244 return false
243 end 245 end
244 local client, err = accept( socket ) -- try to accept 246 local client, err = accept( socket ) -- try to accept
245 if client then 247 if client then
246 local ip, clientport = client:getpeername( ) 248 local ip, clientport = client:getpeername( )
247 local handler, client, err = wrapconnection( handler, listeners, client, ip, serverport, clientport, pattern, sslctx ) -- wrap new client socket 249 local handler, client, err = wrapconnection( handler, listeners, client, ip, serverport, clientport, pattern, sslctx, ssldirect ) -- wrap new client socket
248 if err then -- error while wrapping ssl socket 250 if err then -- error while wrapping ssl socket
249 return false 251 return false
250 end 252 end
251 connections = connections + 1 253 connections = connections + 1
252 out_put( "server.lua: accepted new client connection from ", tostring(ip), ":", tostring(clientport), " to ", tostring(serverport)) 254 out_put( "server.lua: accepted new client connection from ", tostring(ip), ":", tostring(clientport), " to ", tostring(serverport))
253 if dispatch and not sslctx then -- SSL connections will notify onconnect when handshake completes 255 if dispatch and not ssldirect then -- SSL connections will notify onconnect when handshake completes
254 return dispatch( handler ); 256 return dispatch( handler );
255 end 257 end
256 return; 258 return;
257 elseif err then -- maybe timeout or something else 259 elseif err then -- maybe timeout or something else
258 out_put( "server.lua: error with new client connection: ", tostring(err) ) 260 out_put( "server.lua: error with new client connection: ", tostring(err) )
262 end 264 end
263 end 265 end
264 return handler 266 return handler
265 end 267 end
266 268
267 wrapconnection = function( server, listeners, socket, ip, serverport, clientport, pattern, sslctx, extra ) -- this function wraps a client to a handler object 269 wrapconnection = function( server, listeners, socket, ip, serverport, clientport, pattern, sslctx, ssldirect, extra ) -- this function wraps a client to a handler object
268 270
269 if socket:getfd() >= _maxfd then 271 if socket:getfd() >= _maxfd then
270 out_error("server.lua: Disallowed FD number: "..socket:getfd()) -- PROTIP: Switch to libevent 272 out_error("server.lua: Disallowed FD number: "..socket:getfd()) -- PROTIP: Switch to libevent
271 socket:close( ) -- Should we send some kind of error here? 273 socket:close( ) -- Should we send some kind of error here?
272 if server then 274 if server then
284 local shutdown 286 local shutdown
285 287
286 --// private closures of the object //-- 288 --// private closures of the object //--
287 289
288 local ssl 290 local ssl
291
292 local pending
289 293
290 local dispatch = listeners.onincoming 294 local dispatch = listeners.onincoming
291 local status = listeners.onstatus 295 local status = listeners.onstatus
292 local disconnect = listeners.ondisconnect 296 local disconnect = listeners.ondisconnect
293 local drain = listeners.ondrain 297 local drain = listeners.ondrain
339 detach = listeners.ondetach 343 detach = listeners.ondetach
340 if listeners.onattach then 344 if listeners.onattach then
341 listeners.onattach(self, data) 345 listeners.onattach(self, data)
342 end 346 end
343 end 347 end
348 handler._setpending = function( )
349 pending = true
350 end
344 handler.getstats = function( ) 351 handler.getstats = function( )
345 return readtraffic, sendtraffic 352 return readtraffic, sendtraffic
346 end 353 end
347 handler.ssl = function( ) 354 handler.ssl = function( )
348 return ssl 355 return ssl
375 handler.close = function( self, err ) 382 handler.close = function( self, err )
376 if not handler then return true; end 383 if not handler then return true; end
377 _readlistlen = removesocket( _readlist, socket, _readlistlen ) 384 _readlistlen = removesocket( _readlist, socket, _readlistlen )
378 _readtimes[ handler ] = nil 385 _readtimes[ handler ] = nil
379 if bufferqueuelen ~= 0 then 386 if bufferqueuelen ~= 0 then
380 handler.sendbuffer() -- Try now to send any outstanding data 387 handler:sendbuffer() -- Try now to send any outstanding data
381 if bufferqueuelen ~= 0 then -- Still not empty, so we'll try again later 388 if bufferqueuelen ~= 0 then -- Still not empty, so we'll try again later
382 if handler then 389 if handler then
383 handler.write = nil -- ... but no further writing allowed 390 handler.write = nil -- ... but no further writing allowed
384 end 391 end
385 toclose = true 392 toclose = true
427 local write = function( self, data ) 434 local write = function( self, data )
428 if not handler then return false end 435 if not handler then return false end
429 bufferlen = bufferlen + #data 436 bufferlen = bufferlen + #data
430 if bufferlen > maxsendlen then 437 if bufferlen > maxsendlen then
431 _closelist[ handler ] = "send buffer exceeded" -- cannot close the client at the moment, have to wait to the end of the cycle 438 _closelist[ handler ] = "send buffer exceeded" -- cannot close the client at the moment, have to wait to the end of the cycle
432 handler.write = idfalse -- don't write anymore
433 return false 439 return false
434 elseif socket and not _sendlist[ socket ] then 440 elseif not nosend and socket and not _sendlist[ socket ] then
435 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen) 441 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen)
436 end 442 end
437 bufferqueuelen = bufferqueuelen + 1 443 bufferqueuelen = bufferqueuelen + 1
438 bufferqueue[ bufferqueuelen ] = data 444 bufferqueue[ bufferqueuelen ] = data
439 if handler then 445 if handler then
459 handler.bufferlen = function( self, readlen, sendlen ) 465 handler.bufferlen = function( self, readlen, sendlen )
460 maxsendlen = sendlen or maxsendlen 466 maxsendlen = sendlen or maxsendlen
461 maxreadlen = readlen or maxreadlen 467 maxreadlen = readlen or maxreadlen
462 return bufferlen, maxreadlen, maxsendlen 468 return bufferlen, maxreadlen, maxsendlen
463 end 469 end
464 --TODO: Deprecate
465 handler.lock_read = function (self, switch) 470 handler.lock_read = function (self, switch)
471 out_error( "server.lua, lock_read() is deprecated, use pause() and resume()" )
466 if switch == true then 472 if switch == true then
467 local tmp = _readlistlen 473 return self:pause()
468 _readlistlen = removesocket( _readlist, socket, _readlistlen )
469 _readtimes[ handler ] = nil
470 if _readlistlen ~= tmp then
471 noread = true
472 end
473 elseif switch == false then 474 elseif switch == false then
474 if noread then 475 return self:resume()
475 noread = false
476 _readlistlen = addsocket(_readlist, socket, _readlistlen)
477 _readtimes[ handler ] = _currenttime
478 end
479 end 476 end
480 return noread 477 return noread
481 end 478 end
482 handler.pause = function (self) 479 handler.pause = function (self)
483 return self:lock_read(true); 480 local tmp = _readlistlen
481 _readlistlen = removesocket( _readlist, socket, _readlistlen )
482 _readtimes[ handler ] = nil
483 if _readlistlen ~= tmp then
484 noread = true
485 end
486 return noread;
484 end 487 end
485 handler.resume = function (self) 488 handler.resume = function (self)
486 return self:lock_read(false); 489 if noread then
490 noread = false
491 _readlistlen = addsocket(_readlist, socket, _readlistlen)
492 _readtimes[ handler ] = _currenttime
493 end
494 return noread;
487 end 495 end
488 handler.lock = function( self, switch ) 496 handler.lock = function( self, switch )
489 handler.lock_read (switch) 497 out_error( "server.lua, lock() is deprecated" )
498 handler.lock_read (self, switch)
490 if switch == true then 499 if switch == true then
491 handler.write = idfalse 500 handler.pause_writes (self)
492 local tmp = _sendlistlen
493 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
494 _writetimes[ handler ] = nil
495 if _sendlistlen ~= tmp then
496 nosend = true
497 end
498 elseif switch == false then 501 elseif switch == false then
499 handler.write = write 502 handler.resume_writes (self)
500 if nosend then
501 nosend = false
502 write( "" )
503 end
504 end 503 end
505 return noread, nosend 504 return noread, nosend
506 end 505 end
506 handler.pause_writes = function (self)
507 local tmp = _sendlistlen
508 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
509 _writetimes[ handler ] = nil
510 nosend = true
511 end
512 handler.resume_writes = function (self)
513 nosend = false
514 if bufferlen > 0 and socket then
515 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen)
516 end
517 end
518
507 local _readbuffer = function( ) -- this function reads data 519 local _readbuffer = function( ) -- this function reads data
508 local buffer, err, part = receive( socket, pattern ) -- receive buffer with "pattern" 520 local buffer, err, part = receive( socket, pattern ) -- receive buffer with "pattern"
509 if not err or (err == "wantread" or err == "timeout") then -- received something 521 if not err or (err == "wantread" or err == "timeout") then -- received something
510 local buffer = buffer or part or "" 522 local buffer = buffer or part or ""
511 local len = #buffer 523 local len = #buffer
516 local count = len * STAT_UNIT 528 local count = len * STAT_UNIT
517 readtraffic = readtraffic + count 529 readtraffic = readtraffic + count
518 _readtraffic = _readtraffic + count 530 _readtraffic = _readtraffic + count
519 _readtimes[ handler ] = _currenttime 531 _readtimes[ handler ] = _currenttime
520 --out_put( "server.lua: read data '", buffer:gsub("[^%w%p ]", "."), "', error: ", err ) 532 --out_put( "server.lua: read data '", buffer:gsub("[^%w%p ]", "."), "', error: ", err )
533 if pending then -- connection established
534 pending = nil
535 if listeners.onconnect then
536 listeners.onconnect(handler)
537 end
538 end
521 return dispatch( handler, buffer, err ) 539 return dispatch( handler, buffer, err )
522 else -- connections was closed or fatal error 540 else -- connections was closed or fatal error
523 out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " read error: ", tostring(err) ) 541 out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " read error: ", tostring(err) )
524 _ = handler and handler:force_close( err ) 542 _ = handler and handler:force_close( err )
525 return false 543 return false
526 end 544 end
527 end 545 end
528 local _sendbuffer = function( ) -- this function sends data 546 local _sendbuffer = function( ) -- this function sends data
529 local succ, err, byte, buffer, count; 547 local succ, err, byte, buffer, count;
530 if socket then 548 if socket then
549 if pending then
550 pending = nil
551 if listeners.onconnect then
552 listeners.onconnect(handler);
553 end
554 end
531 buffer = table_concat( bufferqueue, "", 1, bufferqueuelen ) 555 buffer = table_concat( bufferqueue, "", 1, bufferqueuelen )
532 succ, err, byte = send( socket, buffer, 1, bufferlen ) 556 succ, err, byte = send( socket, buffer, 1, bufferlen )
533 count = ( succ or byte or 0 ) * STAT_UNIT 557 count = ( succ or byte or 0 ) * STAT_UNIT
534 sendtraffic = sendtraffic + count 558 sendtraffic = sendtraffic + count
535 _sendtraffic = _sendtraffic + count 559 _sendtraffic = _sendtraffic + count
602 end 626 end
603 err = nil; 627 err = nil;
604 coroutine_yield( ) -- handshake not finished 628 coroutine_yield( ) -- handshake not finished
605 end 629 end
606 end 630 end
607 err = "ssl handshake error: " .. ( err or "handshake too long" ); 631 err = ( err or "handshake too long" );
608 out_put( "server.lua: ", err ); 632 out_put( "server.lua: ", err );
609 _ = handler and handler:force_close(err) 633 _ = handler and handler:force_close(err)
610 return false, err -- handshake failed 634 return false, err -- handshake failed
611 end 635 end
612 ) 636 )
622 return 646 return
623 end 647 end
624 out_put( "server.lua: attempting to start tls on " .. tostring( socket ) ) 648 out_put( "server.lua: attempting to start tls on " .. tostring( socket ) )
625 local oldsocket, err = socket 649 local oldsocket, err = socket
626 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket 650 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket
651
627 if not socket then 652 if not socket then
628 out_put( "server.lua: error while starting tls on client: ", tostring(err or "unknown error") ) 653 out_put( "server.lua: error while starting tls on client: ", tostring(err or "unknown error") )
629 return nil, err -- fatal error 654 return nil, err -- fatal error
630 end 655 end
631 656
632 if socket.sni and self.servername then 657 if socket.sni then
633 socket:sni(self.servername); 658 if self.servername then
659 socket:sni(self.servername);
660 elseif self._server and type(self._server.hosts) == "table" and next(self._server.hosts) ~= nil then
661 socket:sni(self.server().hosts, true);
662 end
634 end 663 end
635 664
636 socket:settimeout( 0 ) 665 socket:settimeout( 0 )
637 666
638 -- add the new socket to our system 667 -- add the new socket to our system
666 shutdown = ( ssl and id ) or socket.shutdown 695 shutdown = ( ssl and id ) or socket.shutdown
667 696
668 _socketlist[ socket ] = handler 697 _socketlist[ socket ] = handler
669 _readlistlen = addsocket(_readlist, socket, _readlistlen) 698 _readlistlen = addsocket(_readlist, socket, _readlistlen)
670 699
671 if sslctx and has_luasec then 700 if sslctx and ssldirect and has_luasec then
672 out_put "server.lua: auto-starting ssl negotiation..." 701 out_put "server.lua: auto-starting ssl negotiation..."
673 handler.autostart_ssl = true; 702 handler.autostart_ssl = true;
674 local ok, err = handler:starttls(sslctx); 703 local ok, err = handler:starttls(sslctx);
675 if ok == false then 704 if ok == false then
676 return nil, nil, err 705 return nil, nil, err
721 750
722 local function link(sender, receiver, buffersize) 751 local function link(sender, receiver, buffersize)
723 local sender_locked; 752 local sender_locked;
724 local _sendbuffer = receiver.sendbuffer; 753 local _sendbuffer = receiver.sendbuffer;
725 function receiver.sendbuffer() 754 function receiver.sendbuffer()
726 _sendbuffer(); 755 _sendbuffer(receiver);
727 if sender_locked and receiver.bufferlen() < buffersize then 756 if sender_locked and receiver.bufferlen() < buffersize then
728 sender:lock_read(false); -- Unlock now 757 sender:lock_read(false); -- Unlock now
729 sender_locked = nil; 758 sender_locked = nil;
730 end 759 end
731 end 760 end
741 sender:set_mode("*a"); 770 sender:set_mode("*a");
742 end 771 end
743 772
744 ----------------------------------// PUBLIC //-- 773 ----------------------------------// PUBLIC //--
745 774
746 addserver = function( addr, port, listeners, pattern, sslctx ) -- this function provides a way for other scripts to reg a server 775 listen = function ( addr, port, listeners, config )
747 addr = addr or "*" 776 addr = addr or "*"
777 config = config or {}
748 local err 778 local err
779 local sslctx = config.tls_ctx;
780 local ssldirect = config.tls_direct;
781 local pattern = config.read_size;
749 if type( listeners ) ~= "table" then 782 if type( listeners ) ~= "table" then
750 err = "invalid listener table" 783 err = "invalid listener table"
751 elseif type ( addr ) ~= "string" then 784 elseif type ( addr ) ~= "string" then
752 err = "invalid address" 785 err = "invalid address"
753 elseif type( port ) ~= "number" or not ( port >= 0 and port <= 65535 ) then 786 elseif type( port ) ~= "number" or not ( port >= 0 and port <= 65535 ) then
764 local server, err = socket_bind( addr, port, _tcpbacklog ) 797 local server, err = socket_bind( addr, port, _tcpbacklog )
765 if err then 798 if err then
766 out_error( "server.lua, [", addr, "]:", port, ": ", err ) 799 out_error( "server.lua, [", addr, "]:", port, ": ", err )
767 return nil, err 800 return nil, err
768 end 801 end
769 local handler, err = wrapserver( listeners, server, addr, port, pattern, sslctx ) -- wrap new server socket 802 local handler, err = wrapserver( listeners, server, addr, port, pattern, sslctx, ssldirect ) -- wrap new server socket
770 if not handler then 803 if not handler then
771 server:close( ) 804 server:close( )
772 return nil, err 805 return nil, err
773 end 806 end
774 server:settimeout( 0 ) 807 server:settimeout( 0 )
775 _readlistlen = addsocket(_readlist, server, _readlistlen) 808 _readlistlen = addsocket(_readlist, server, _readlistlen)
776 _server[ addr..":"..port ] = handler 809 _server[ addr..":"..port ] = handler
777 _socketlist[ server ] = handler 810 _socketlist[ server ] = handler
778 out_put( "server.lua: new "..(sslctx and "ssl " or "").."server listener on '[", addr, "]:", port, "'" ) 811 out_put( "server.lua: new "..(sslctx and "ssl " or "").."server listener on '[", addr, "]:", port, "'" )
779 return handler 812 return handler
813 end
814
815 addserver = function( addr, port, listeners, pattern, sslctx ) -- this function provides a way for other scripts to reg a server
816 return listen(addr, port, listeners, {
817 read_size = pattern;
818 tls_ctx = sslctx;
819 tls_direct = sslctx and true or false;
820 });
780 end 821 end
781 822
782 getserver = function ( addr, port ) 823 getserver = function ( addr, port )
783 return _server[ addr..":"..port ]; 824 return _server[ addr..":"..port ];
784 end 825 end
919 960
920 local read, write, err = socket_select( _readlist, _sendlist, math_min(_selecttimeout, next_timer_time) ) 961 local read, write, err = socket_select( _readlist, _sendlist, math_min(_selecttimeout, next_timer_time) )
921 for _, socket in ipairs( read ) do -- receive data 962 for _, socket in ipairs( read ) do -- receive data
922 local handler = _socketlist[ socket ] 963 local handler = _socketlist[ socket ]
923 if handler then 964 if handler then
924 handler.readbuffer( ) 965 handler:readbuffer( )
925 else 966 else
926 closesocket( socket ) 967 closesocket( socket )
927 out_put "server.lua: found no handler and closed socket (readlist)" -- this can happen 968 out_put "server.lua: found no handler and closed socket (readlist)" -- this can happen
928 end 969 end
929 end 970 end
930 for _, socket in ipairs( write ) do -- send data waiting in writequeues 971 for _, socket in ipairs( write ) do -- send data waiting in writequeues
931 local handler = _socketlist[ socket ] 972 local handler = _socketlist[ socket ]
932 if handler then 973 if handler then
933 handler.sendbuffer( ) 974 handler:sendbuffer( )
934 else 975 else
935 closesocket( socket ) 976 closesocket( socket )
936 out_put "server.lua: found no handler and closed socket (writelist)" -- this should not happen 977 out_put "server.lua: found no handler and closed socket (writelist)" -- this should not happen
937 end 978 end
938 end 979 end
985 end 1026 end
986 1027
987 --// EXPERIMENTAL //-- 1028 --// EXPERIMENTAL //--
988 1029
989 local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx, extra ) 1030 local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx, extra )
990 local handler, socket, err = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx, extra) 1031 local handler, socket, err = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx, sslctx, extra)
991 if not handler then return nil, err end 1032 if not handler then return nil, err end
992 _socketlist[ socket ] = handler 1033 _socketlist[ socket ] = handler
993 if not sslctx then 1034 if not sslctx then
1035 handler._setpending()
994 _readlistlen = addsocket(_readlist, socket, _readlistlen) 1036 _readlistlen = addsocket(_readlist, socket, _readlistlen)
995 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen) 1037 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen)
996 if listeners.onconnect then
997 -- When socket is writeable, call onconnect
998 local _sendbuffer = handler.sendbuffer;
999 handler.sendbuffer = function ()
1000 handler.sendbuffer = _sendbuffer;
1001 listeners.onconnect(handler);
1002 return _sendbuffer(); -- Send any queued outgoing data
1003 end
1004 end
1005 end 1038 end
1006 return handler, socket 1039 return handler, socket
1007 end 1040 end
1008 1041
1009 local addclient = function( address, port, listeners, pattern, sslctx, typ, extra ) 1042 local addclient = function( address, port, listeners, pattern, sslctx, typ, extra )
1121 link = link, 1154 link = link,
1122 step = step, 1155 step = step,
1123 stats = stats, 1156 stats = stats,
1124 closeall = closeall, 1157 closeall = closeall,
1125 addserver = addserver, 1158 addserver = addserver,
1159 listen = listen,
1126 getserver = getserver, 1160 getserver = getserver,
1127 setlogger = setlogger, 1161 setlogger = setlogger,
1128 getsettings = getsettings, 1162 getsettings = getsettings,
1129 setquitting = setquitting, 1163 setquitting = setquitting,
1130 removeserver = removeserver, 1164 removeserver = removeserver,