17 tbl[ i ] = nil |
17 tbl[ i ] = nil |
18 end |
18 end |
19 end |
19 end |
20 |
20 |
21 local log, table_concat = require ("util.logger").init("socket"), table.concat; |
21 local log, table_concat = require ("util.logger").init("socket"), table.concat; |
22 local out_put = function () end |
22 local out_put = function (...) return log("debug", table_concat{...}); end |
23 local out_error = function (...) return log("warn", table_concat{...}); end |
23 local out_error = function (...) return log("warn", table_concat{...}); end |
24 local mem_free = collectgarbage |
24 local mem_free = collectgarbage |
25 |
25 |
26 ----------------------------------// DECLARATION //-- |
26 ----------------------------------// DECLARATION //-- |
27 |
27 |
431 end |
431 end |
432 local count = len * STAT_UNIT |
432 local count = len * STAT_UNIT |
433 readtraffic = readtraffic + count |
433 readtraffic = readtraffic + count |
434 _readtraffic = _readtraffic + count |
434 _readtraffic = _readtraffic + count |
435 _readtimes[ handler ] = _currenttime |
435 _readtimes[ handler ] = _currenttime |
436 out_put( "server.lua: read data '", buffer, "', error: ", err ) |
436 --out_put( "server.lua: read data '", buffer, "', error: ", err ) |
437 return dispatch( handler, buffer, err ) |
437 return dispatch( handler, buffer, err ) |
438 else -- connections was closed or fatal error |
438 else -- connections was closed or fatal error |
439 out_put( "server.lua: client ", ip, ":", clientport, " error: ", err ) |
439 out_put( "server.lua: client ", ip, ":", clientport, " error: ", err ) |
440 fatalerror = true |
440 fatalerror = true |
441 disconnect( handler, err ) |
441 disconnect( handler, err ) |
448 local succ, err, byte = send( socket, buffer, 1, bufferlen ) |
448 local succ, err, byte = send( socket, buffer, 1, bufferlen ) |
449 local count = ( succ or byte or 0 ) * STAT_UNIT |
449 local count = ( succ or byte or 0 ) * STAT_UNIT |
450 sendtraffic = sendtraffic + count |
450 sendtraffic = sendtraffic + count |
451 _sendtraffic = _sendtraffic + count |
451 _sendtraffic = _sendtraffic + count |
452 _ = _cleanqueue and clean( bufferqueue ) |
452 _ = _cleanqueue and clean( bufferqueue ) |
453 out_put( "server.lua: sended '", buffer, "', bytes: ", succ, ", error: ", err, ", part: ", byte, ", to: ", ip, ":", clientport ) |
453 --out_put( "server.lua: sended '", buffer, "', bytes: ", succ, ", error: ", err, ", part: ", byte, ", to: ", ip, ":", clientport ) |
454 if succ then -- sending succesful |
454 if succ then -- sending succesful |
455 bufferqueuelen = 0 |
455 bufferqueuelen = 0 |
456 bufferlen = 0 |
456 bufferlen = 0 |
457 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist |
457 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist |
458 _ = needtls and handler.starttls(true) |
458 _ = needtls and handler.starttls(true) |
481 local handshake = coroutine_wrap( function( client ) -- create handshake coroutine |
481 local handshake = coroutine_wrap( function( client ) -- create handshake coroutine |
482 local err |
482 local err |
483 for i = 1, 10 do -- 10 handshake attemps |
483 for i = 1, 10 do -- 10 handshake attemps |
484 _, err = client:dohandshake( ) |
484 _, err = client:dohandshake( ) |
485 if not err then |
485 if not err then |
486 out_put( "server.lua: ssl handshake done" ) |
486 --out_put( "server.lua: ssl handshake done" ) |
487 _sendlistlen = ( wrote and removesocket( _sendlist, socket, _sendlistlen ) ) or _sendlistlen |
487 _sendlistlen = ( wrote and removesocket( _sendlist, socket, _sendlistlen ) ) or _sendlistlen |
488 handler.readbuffer = _readbuffer -- when handshake is done, replace the handshake function with regular functions |
488 handler.readbuffer = _readbuffer -- when handshake is done, replace the handshake function with regular functions |
489 handler.sendbuffer = _sendbuffer |
489 handler.sendbuffer = _sendbuffer |
490 --return dispatch( handler ) |
490 --return dispatch( handler ) |
491 return true |
491 return true |
504 handler.close( true ) -- forced disconnect |
504 handler.close( true ) -- forced disconnect |
505 return false -- handshake failed |
505 return false -- handshake failed |
506 end |
506 end |
507 ) |
507 ) |
508 if startssl then -- ssl now? |
508 if startssl then -- ssl now? |
509 out_put("server.lua: ", "starting ssl handshake") |
509 --out_put("server.lua: ", "starting ssl handshake") |
510 local err |
510 local err |
511 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket |
511 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket |
512 if err then |
512 if err then |
513 out_put( "server.lua: ssl error: ", err ) |
513 out_put( "server.lua: ssl error: ", err ) |
514 mem_free( ) |
514 mem_free( ) |
519 handler.sendbuffer = handshake |
519 handler.sendbuffer = handshake |
520 handshake( socket ) -- do handshake |
520 handshake( socket ) -- do handshake |
521 else |
521 else |
522 handler.starttls = function( now ) |
522 handler.starttls = function( now ) |
523 if not now then |
523 if not now then |
524 out_put "server.lua: we need to do tls, but delaying until later" |
524 --out_put "server.lua: we need to do tls, but delaying until later" |
525 needtls = true |
525 needtls = true |
526 return |
526 return |
527 end |
527 end |
528 out_put( "server.lua: attempting to start tls on " .. tostring( socket ) ) |
528 --out_put( "server.lua: attempting to start tls on " .. tostring( socket ) ) |
529 local oldsocket, err = socket |
529 local oldsocket, err = socket |
530 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket |
530 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket |
531 out_put( "server.lua: sslwrapped socket is " .. tostring( socket ) ) |
531 --out_put( "server.lua: sslwrapped socket is " .. tostring( socket ) ) |
532 if err then |
532 if err then |
533 out_put( "server.lua: error while starting tls on client: ", err ) |
533 out_put( "server.lua: error while starting tls on client: ", err ) |
534 return nil, err -- fatal error |
534 return nil, err -- fatal error |
535 end |
535 end |
536 |
536 |
613 |
613 |
614 ----------------------------------// PUBLIC //-- |
614 ----------------------------------// PUBLIC //-- |
615 |
615 |
616 addserver = function( listeners, port, addr, pattern, sslctx, maxconnections, startssl ) -- this function provides a way for other scripts to reg a server |
616 addserver = function( listeners, port, addr, pattern, sslctx, maxconnections, startssl ) -- this function provides a way for other scripts to reg a server |
617 local err |
617 local err |
618 out_put("server.lua: autossl on ", port, " is ", startssl) |
618 --out_put("server.lua: autossl on ", port, " is ", startssl) |
619 if type( listeners ) ~= "table" then |
619 if type( listeners ) ~= "table" then |
620 err = "invalid listener table" |
620 err = "invalid listener table" |
621 end |
621 end |
622 if not type( port ) == "number" or not ( port >= 0 and port <= 65535 ) then |
622 if not type( port ) == "number" or not ( port >= 0 and port <= 65535 ) then |
623 err = "invalid port" |
623 err = "invalid port" |