478 end |
478 end |
479 |
479 |
480 if sslctx then -- ssl? |
480 if sslctx then -- ssl? |
481 ssl = true |
481 ssl = true |
482 local wrote |
482 local wrote |
|
483 local read |
483 local handshake = coroutine_wrap( function( client ) -- create handshake coroutine |
484 local handshake = coroutine_wrap( function( client ) -- create handshake coroutine |
484 local err |
485 local err |
485 for i = 1, 10 do -- 10 handshake attemps |
486 for i = 1, 10 do -- 10 handshake attemps |
|
487 _sendlistlen = ( wrote and removesocket( _sendlist, socket, _sendlistlen ) ) or _sendlistlen |
|
488 _readlistlen = ( read and removesocket( _readlist, socket, _readlistlen ) ) or _readlistlen |
|
489 read, wrote = nil, nil |
486 _, err = client:dohandshake( ) |
490 _, err = client:dohandshake( ) |
487 if not err then |
491 if not err then |
488 --out_put( "server.lua: ssl handshake done" ) |
492 --out_put( "server.lua: ssl handshake done" ) |
489 _sendlistlen = ( wrote and removesocket( _sendlist, socket, _sendlistlen ) ) or _sendlistlen |
|
490 handler.readbuffer = _readbuffer -- when handshake is done, replace the handshake function with regular functions |
493 handler.readbuffer = _readbuffer -- when handshake is done, replace the handshake function with regular functions |
491 handler.sendbuffer = _sendbuffer |
494 handler.sendbuffer = _sendbuffer |
492 --return dispatch( handler ) |
495 -- return dispatch( handler ) |
493 return true |
496 return true |
494 else |
497 else |
495 out_put( "server.lua: error during ssl handshake: ", err ) |
498 out_put( "server.lua: error during ssl handshake: ", err ) |
496 if err == "wantwrite" and not wrote then |
499 if err == "wantwrite" and not wrote then |
497 _sendlistlen = _sendlistlen + 1 |
500 _sendlistlen = _sendlistlen + 1 |
498 _sendlist[ _sendlistlen ] = client |
501 _sendlist[ _sendlistlen ] = client |
499 wrote = true |
502 wrote = true |
|
503 elseif err == "wantread" and not read then |
|
504 _readlistlen = _readlistlen + 1 |
|
505 _readlist [ _readlistlen ] = client |
|
506 read = true |
500 end |
507 end |
501 --coroutine_yield( handler, nil, err ) -- handshake not finished |
508 --coroutine_yield( handler, nil, err ) -- handshake not finished |
502 coroutine_yield( ) |
509 coroutine_yield( ) |
503 end |
510 end |
504 end |
511 end |
556 _socketlist[ oldsocket ] = nil |
563 _socketlist[ oldsocket ] = nil |
557 |
564 |
558 handler.starttls = nil |
565 handler.starttls = nil |
559 needtls = nil |
566 needtls = nil |
560 |
567 |
561 handler.receivedata = handler.handshake |
568 handler.readbuffer = handshake |
562 handler.dispatchdata = handler.handshake |
569 handler.sendbuffer = handshake |
563 handshake( socket ) -- do handshake |
570 handshake( socket ) -- do handshake |
564 end |
571 end |
565 handler.readbuffer = _readbuffer |
572 handler.readbuffer = _readbuffer |
566 handler.sendbuffer = _sendbuffer |
573 handler.sendbuffer = _sendbuffer |
567 end |
574 end |