Mercurial > prosody-hg
comparison net/server.lua @ 846:77244ba297ac
net.server: Some fixes for SSL/TLS handshake handling
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 27 Feb 2009 18:40:17 +0000 |
| parents | cf8392613f46 |
| children | edbd0d1fce93 |
comparison
equal
deleted
inserted
replaced
| 845:fc3dced9801e | 846:77244ba297ac |
|---|---|
| 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 |
