Mercurial > prosody-hg
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, |
