529 _ = handler and handler.close( ) |
529 _ = handler and handler.close( ) |
530 return false |
530 return false |
531 end |
531 end |
532 end |
532 end |
533 |
533 |
534 if sslctx then -- ssl? |
534 -- Set the sslctx |
|
535 local handshake; |
|
536 function handler.set_sslctx(new_sslctx) |
535 ssl = true |
537 ssl = true |
|
538 sslctx = new_sslctx; |
536 local wrote |
539 local wrote |
537 local read |
540 local read |
538 local handshake = coroutine_wrap( function( client ) -- create handshake coroutine |
541 handshake = coroutine_wrap( function( client ) -- create handshake coroutine |
539 local err |
542 local err |
540 for i = 1, _maxsslhandshake do |
543 for i = 1, _maxsslhandshake do |
541 _sendlistlen = ( wrote and removesocket( _sendlist, socket, _sendlistlen ) ) or _sendlistlen |
544 _sendlistlen = ( wrote and removesocket( _sendlist, socket, _sendlistlen ) ) or _sendlistlen |
542 _readlistlen = ( read and removesocket( _readlist, socket, _readlistlen ) ) or _readlistlen |
545 _readlistlen = ( read and removesocket( _readlist, socket, _readlistlen ) ) or _readlistlen |
543 read, wrote = nil, nil |
546 read, wrote = nil, nil |
547 handler.readbuffer = _readbuffer -- when handshake is done, replace the handshake function with regular functions |
550 handler.readbuffer = _readbuffer -- when handshake is done, replace the handshake function with regular functions |
548 handler.sendbuffer = _sendbuffer |
551 handler.sendbuffer = _sendbuffer |
549 _ = status and status( handler, "ssl-handshake-complete" ) |
552 _ = status and status( handler, "ssl-handshake-complete" ) |
550 return true |
553 return true |
551 else |
554 else |
552 out_put( "server.lua: error during ssl handshake: ", tostring(err) ) |
555 out_put( "server.lua: error during ssl handshake: ", tostring(err) ) |
553 if err == "wantwrite" and not wrote then |
556 if err == "wantwrite" and not wrote then |
554 _sendlistlen = _sendlistlen + 1 |
557 _sendlistlen = _sendlistlen + 1 |
555 _sendlist[ _sendlistlen ] = client |
558 _sendlist[ _sendlistlen ] = client |
556 wrote = true |
559 wrote = true |
557 elseif err == "wantread" and not read then |
560 elseif err == "wantread" and not read then |
558 _readlistlen = _readlistlen + 1 |
561 _readlistlen = _readlistlen + 1 |
559 _readlist [ _readlistlen ] = client |
562 _readlist [ _readlistlen ] = client |
560 read = true |
563 read = true |
561 else |
564 else |
562 break; |
565 break; |
563 end |
566 end |
564 --coroutine_yield( handler, nil, err ) -- handshake not finished |
567 --coroutine_yield( handler, nil, err ) -- handshake not finished |
565 coroutine_yield( ) |
568 coroutine_yield( ) |
566 end |
569 end |
567 end |
570 end |
568 disconnect( handler, "ssl handshake failed" ) |
571 disconnect( handler, "ssl handshake failed" ) |
569 _ = handler and handler.close( true ) -- forced disconnect |
572 _ = handler and handler.close( true ) -- forced disconnect |
570 return false -- handshake failed |
573 return false -- handshake failed |
571 end |
574 end |
572 ) |
575 ) |
|
576 end |
|
577 if sslctx then -- ssl? |
|
578 handler.set_sslctx(sslctx); |
573 if startssl then -- ssl now? |
579 if startssl then -- ssl now? |
574 --out_put("server.lua: ", "starting ssl handshake") |
580 --out_put("server.lua: ", "starting ssl handshake") |
575 local err |
581 local err |
576 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket |
582 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket |
577 if err then |
583 if err then |