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 |
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 ) |