428 end |
428 end |
429 return noread, nosend |
429 return noread, nosend |
430 end |
430 end |
431 local _readbuffer = function( ) -- this function reads data |
431 local _readbuffer = function( ) -- this function reads data |
432 local buffer, err, part = receive( socket, pattern ) -- receive buffer with "pattern" |
432 local buffer, err, part = receive( socket, pattern ) -- receive buffer with "pattern" |
433 if not err or (err == "wantread" or err == "timeout") or string_len(part) > 0 then -- received something |
433 if not err or (err == "wantread" or err == "timeout") or (part and string_len(part) > 0) then -- received something |
434 local buffer = buffer or part or "" |
434 local buffer = buffer or part or "" |
435 local len = string_len( buffer ) |
435 local len = string_len( buffer ) |
436 if len > maxreadlen then |
436 if len > maxreadlen then |
437 disconnect( handler, "receive buffer exceeded" ) |
437 disconnect( handler, "receive buffer exceeded" ) |
438 handler.close( true ) |
438 handler:close( true ) |
439 return false |
439 return false |
440 end |
440 end |
441 local count = len * STAT_UNIT |
441 local count = len * STAT_UNIT |
442 readtraffic = readtraffic + count |
442 readtraffic = readtraffic + count |
443 _readtraffic = _readtraffic + count |
443 _readtraffic = _readtraffic + count |
446 return dispatch( handler, buffer, err ) |
446 return dispatch( handler, buffer, err ) |
447 else -- connections was closed or fatal error |
447 else -- connections was closed or fatal error |
448 out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " read error: ", tostring(err) ) |
448 out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " read error: ", tostring(err) ) |
449 fatalerror = true |
449 fatalerror = true |
450 disconnect( handler, err ) |
450 disconnect( handler, err ) |
451 _ = handler and handler.close( ) |
451 _ = handler and handler:close( ) |
452 return false |
452 return false |
453 end |
453 end |
454 end |
454 end |
455 local _sendbuffer = function( ) -- this function sends data |
455 local _sendbuffer = function( ) -- this function sends data |
456 local succ, err, byte, buffer, count; |
456 local succ, err, byte, buffer, count; |
470 bufferqueuelen = 0 |
470 bufferqueuelen = 0 |
471 bufferlen = 0 |
471 bufferlen = 0 |
472 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist |
472 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist |
473 _ = needtls and handler:starttls(nil, true) |
473 _ = needtls and handler:starttls(nil, true) |
474 _writetimes[ handler ] = nil |
474 _writetimes[ handler ] = nil |
475 _ = toclose and handler.close( ) |
475 _ = toclose and handler:close( ) |
476 return true |
476 return true |
477 elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write |
477 elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write |
478 buffer = string_sub( buffer, byte + 1, bufferlen ) -- new buffer |
478 buffer = string_sub( buffer, byte + 1, bufferlen ) -- new buffer |
479 bufferqueue[ 1 ] = buffer -- insert new buffer in queue |
479 bufferqueue[ 1 ] = buffer -- insert new buffer in queue |
480 bufferqueuelen = 1 |
480 bufferqueuelen = 1 |
483 return true |
483 return true |
484 else -- connection was closed during sending or fatal error |
484 else -- connection was closed during sending or fatal error |
485 out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " write error: ", tostring(err) ) |
485 out_put( "server.lua: client ", tostring(ip), ":", tostring(clientport), " write error: ", tostring(err) ) |
486 fatalerror = true |
486 fatalerror = true |
487 disconnect( handler, err ) |
487 disconnect( handler, err ) |
488 _ = handler and handler.close( ) |
488 _ = handler and handler:close( ) |
489 return false |
489 return false |
490 end |
490 end |
491 end |
491 end |
492 |
492 |
493 -- Set the sslctx |
493 -- Set the sslctx |