net/server.lua

branch
tls
changeset 66
018705d57f09
parent 65
9c471840acb9
child 74
09bda2782837
equal deleted inserted replaced
65:9c471840acb9 66:018705d57f09
444 if not err or ( err == "timeout" or err == "wantread" ) then -- received something 444 if not err or ( err == "timeout" or err == "wantread" ) then -- received something
445 local data = data or part or "" 445 local data = data or part or ""
446 local count = #data * STAT_UNIT 446 local count = #data * STAT_UNIT
447 rstat = rstat + count 447 rstat = rstat + count
448 receivestat = receivestat + count 448 receivestat = receivestat + count
449 out_put( "server.lua: read data '", data, "', error: ", err ) 449 --out_put( "server.lua: read data '", data, "', error: ", err )
450 return dispatch( handler, data, err ) 450 return dispatch( handler, data, err )
451 else -- connections was closed or fatal error 451 else -- connections was closed or fatal error
452 out_put( "server.lua: client ", ip, ":", clientport, " error: ", err ) 452 out_put( "server.lua: client ", ip, ":", clientport, " error: ", err )
453 handler.close( ) 453 handler.close( )
454 disconnect( handler, err ) 454 disconnect( handler, err )
468 --writequeue = { } 468 --writequeue = { }
469 eol = nil 469 eol = nil
470 writelen = removesocket( writelist, socket, writelen ) -- delete socket from writelist 470 writelen = removesocket( writelist, socket, writelen ) -- delete socket from writelist
471 if handler.need_tls then 471 if handler.need_tls then
472 out_put("server.lua: connection is ready for tls handshake"); 472 out_put("server.lua: connection is ready for tls handshake");
473 handler.need_tls = not handler.starttls(true); 473 handler.starttls(true);
474 if handler.need_tls then
475 out_put("server.lua: uh-oh... we still want tls, something must be wrong");
476 end
474 end 477 end
475 return true 478 return true
476 elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write 479 elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write
477 buffer = string_sub( buffer, byte + 1, -1 ) -- new buffer 480 buffer = string_sub( buffer, byte + 1, -1 ) -- new buffer
478 writequeue[ 1 ] = buffer -- insert new buffer in queue 481 writequeue[ 1 ] = buffer -- insert new buffer in queue
497 --// handshake //-- 500 --// handshake //--
498 501
499 local wrote, read 502 local wrote, read
500 503
501 handler.starttls = function (now) 504 handler.starttls = function (now)
502 if not now then handler.need_tls = true; return; end 505 if not now then out_put("server.lua: we need to do tls, but delaying until later"); handler.need_tls = true; return; end
503 out_put( "server.lua: attempting to start tls on "..tostring(socket) ) 506 out_put( "server.lua: attempting to start tls on "..tostring(socket) )
504 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket 507 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket
505 out_put("sslwrapped socket is "..tostring(socket)); 508 out_put("sslwrapped socket is "..tostring(socket));
506 if err then 509 if err then
507 out_put( "server.lua: ssl error: ", err ) 510 out_put( "server.lua: ssl error: ", err )
509 end 512 end
510 socket:settimeout( 1 ) 513 socket:settimeout( 1 )
511 send = socket.send 514 send = socket.send
512 receive = socket.receive 515 receive = socket.receive
513 close = socket.close 516 close = socket.close
514 print(readlen, writelen)
515 for _, s in ipairs(readlist) do print("R:", tostring(s)) end
516 for _, s in ipairs(writelist) do print("W:", tostring(s)) end
517 handler.ssl = function( ) 517 handler.ssl = function( )
518 return true 518 return true
519 end 519 end
520 handler.send = function( _, data, i, j ) 520 handler.send = function( _, data, i, j )
521 return send( socket, data, i, j ) 521 return send( socket, data, i, j )
522 end 522 end
523 handler.receive = function( pattern, prefix ) 523 handler.receive = function( pattern, prefix )
524 return receive( socket, pattern, prefix ) 524 return receive( socket, pattern, prefix )
525 end 525 end
526 526
527 handler.handshake = function (conn) 527 handler.handshake = coroutine_wrap( function( client )
528 local succ, msg 528 local err
529 out_put("ssl handshaking on socket "..tostring(conn)) 529 for i = 1, 10 do -- 10 handshake attemps
530 conn:settimeout() 530 _, err = client:dohandshake( )
531 while not succ do 531 if not err then
532 succ, msg = conn:dohandshake() 532 out_put( "server.lua: ssl handshake done" )
533 out_put("msg: "..tostring(msg)) 533 writelen = ( wrote and removesocket( writelist, socket, writelen ) ) or writelen
534 if msg == 'wantread' then 534 handler.receivedata = handler._receivedata -- when handshake is done, replace the handshake function with regular functions
535 socket_select({conn}, nil) 535 handler.dispatchdata = handler._dispatchdata
536 elseif msg == 'wantwrite' then 536 handler.need_tls = nil
537 socket_select(nil, {conn}) 537 socketlist[ client ] = handler
538 elseif not succ then 538 readlen = readlen + 1
539 -- other error 539 readlist[ readlen ] = client
540 _ = err ~= "closed" and close( socket ) 540 return true;
541 handler.close( ) 541 else
542 disconnect( handler, err ) 542 out_put( "server.lua: error during ssl handshake: ", err )
543 writequeue = nil 543 if err == "wantwrite" then
544 handler = nil 544 if wrote == nil then
545 out_error("server.lua: ssl handshake failed"); 545 writelen = writelen + 1
546 return false -- handshake failed 546 writelist[ writelen ] = client
547 wrote = true
547 end 548 end
548
549 end 549 end
550 out_put("server.lua: ssl handshake succeeded!"); 550 coroutine_yield( handler, nil, err ) -- handshake not finished
551 handler.receivedata = handler._receivedata;
552 handler.dispatchdata = handler._dispatchdata;
553 return true;
554 end 551 end
555 552 end
556 handler.receivedata = handler.handshake 553 _ = err ~= "closed" and close( socket )
557 handler.dispatchdata = handler.handshake 554 handler.close( )
558 555 disconnect( handler, err )
559 return handler.handshake( socket ) -- do handshake 556 writequeue = nil
560 end 557 handler = nil
561 558 return false -- handshake failed
559 end
560 )
561 handler.receivedata = handler.handshake
562 handler.dispatchdata = handler.handshake
563
564 handler.handshake( socket ) -- do handshake
565 end
562 socketlist[ socket ] = handler 566 socketlist[ socket ] = handler
563 readlen = readlen + 1 567 readlen = readlen + 1
564 readlist[ readlen ] = socket 568 readlist[ readlen ] = socket
565 569
566 return handler, socket 570 return handler, socket
783 end 787 end
784 788
785 loop = function( ) -- this is the main loop of the program 789 loop = function( ) -- this is the main loop of the program
786 --signal_set( "hub", "run" ) 790 --signal_set( "hub", "run" )
787 repeat 791 repeat
788 out_put("select()") 792 --[[print(readlen, writelen)
793 for _, s in ipairs(readlist) do print("R:", tostring(s)) end
794 for _, s in ipairs(writelist) do print("W:", tostring(s)) end
795 out_put("select()"..os.time())]]
789 local read, write, err = socket_select( readlist, writelist, 1 ) -- 1 sec timeout, nice for timers 796 local read, write, err = socket_select( readlist, writelist, 1 ) -- 1 sec timeout, nice for timers
790 for i, socket in ipairs( write ) do -- send data waiting in writequeues 797 for i, socket in ipairs( write ) do -- send data waiting in writequeues
791 local handler = socketlist[ socket ] 798 local handler = socketlist[ socket ]
792 if handler then 799 if handler then
793 handler.dispatchdata( ) 800 handler.dispatchdata( )

mercurial