Mercurial > prosody-hg
comparison net/server_event.lua @ 11063:30d3f6f85eb8 0.11
net.server: Backport client parts of SNI support from trunk (#409)
Partial backports of the following commits from trunk:
6c804b6b2ca2 net.http: Pass server name along for SNI (fixes #1408)
75d2874502c3 net.server_select: SNI support (#409)
9a905888b96c net.server_event: Add SNI support (#409)
adc0672b700e net.server_epoll: Add support for SNI (#409)
d4390c427a66 net.server: Handle server name (SNI) as extra argument
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 17 Aug 2020 23:01:14 +0200 |
| parents | 36e379f058c8 |
| children | 988ddd57e851 |
comparison
equal
deleted
inserted
replaced
| 11061:45e1c467a3a7 | 11063:30d3f6f85eb8 |
|---|---|
| 162 end | 162 end |
| 163 self:_close() | 163 self:_close() |
| 164 debug( "fatal error while ssl wrapping:", err ) | 164 debug( "fatal error while ssl wrapping:", err ) |
| 165 return false | 165 return false |
| 166 end | 166 end |
| 167 | |
| 168 if self.conn.sni and self.servername then | |
| 169 self.conn:sni(self.servername); | |
| 170 end | |
| 171 | |
| 167 self.conn:settimeout( 0 ) -- set non blocking | 172 self.conn:settimeout( 0 ) -- set non blocking |
| 168 local handshakecallback = coroutine_wrap(function( event ) | 173 local handshakecallback = coroutine_wrap(function( event ) |
| 169 local _, err | 174 local _, err |
| 170 local attempt = 0 | 175 local attempt = 0 |
| 171 local maxattempt = cfg.MAX_HANDSHAKE_ATTEMPTS | 176 local maxattempt = cfg.MAX_HANDSHAKE_ATTEMPTS |
| 454 function interface_mt:onstatus() | 459 function interface_mt:onstatus() |
| 455 end | 460 end |
| 456 | 461 |
| 457 -- End of client interface methods | 462 -- End of client interface methods |
| 458 | 463 |
| 459 local function handleclient( client, ip, port, server, pattern, listener, sslctx ) -- creates an client interface | 464 local function handleclient( client, ip, port, server, pattern, listener, sslctx, extra ) -- creates an client interface |
| 460 --vdebug("creating client interfacce...") | 465 --vdebug("creating client interfacce...") |
| 461 local interface = { | 466 local interface = { |
| 462 type = "client"; | 467 type = "client"; |
| 463 conn = client; | 468 conn = client; |
| 464 currenttime = socket_gettime( ); -- safe the origin | 469 currenttime = socket_gettime( ); -- safe the origin |
| 490 -- Properties | 495 -- Properties |
| 491 _ip = ip, _port = port, _server = server, _pattern = pattern, | 496 _ip = ip, _port = port, _server = server, _pattern = pattern, |
| 492 _serverport = (server and server:port() or nil), | 497 _serverport = (server and server:port() or nil), |
| 493 _sslctx = sslctx; -- parameters | 498 _sslctx = sslctx; -- parameters |
| 494 _usingssl = false; -- client is using ssl; | 499 _usingssl = false; -- client is using ssl; |
| 500 extra = extra; | |
| 501 servername = extra and extra.servername; | |
| 495 } | 502 } |
| 496 if not has_luasec then interface.starttls = false; end | 503 if not has_luasec then interface.starttls = false; end |
| 497 interface.id = tostring(interface):match("%x+$"); | 504 interface.id = tostring(interface):match("%x+$"); |
| 498 interface.writecallback = function( event ) -- called on write events | 505 interface.writecallback = function( event ) -- called on write events |
| 499 --vdebug( "new client write event, id/ip/port:", interface, ip, port ) | 506 --vdebug( "new client write event, id/ip/port:", interface, ip, port ) |
| 714 local interface = handleserver( server, addr, port, pattern, listener, sslctx, startssl ) -- new server handler | 721 local interface = handleserver( server, addr, port, pattern, listener, sslctx, startssl ) -- new server handler |
| 715 debug( "new server created with id:", tostring(interface)) | 722 debug( "new server created with id:", tostring(interface)) |
| 716 return interface | 723 return interface |
| 717 end | 724 end |
| 718 | 725 |
| 719 local function wrapclient( client, ip, port, listeners, pattern, sslctx ) | 726 local function wrapclient( client, ip, port, listeners, pattern, sslctx, extra ) |
| 720 local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx ) | 727 local interface = handleclient( client, ip, port, nil, pattern, listeners, sslctx, extra ) |
| 721 interface:_start_connection(sslctx) | 728 interface:_start_connection(sslctx) |
| 722 return interface, client | 729 return interface, client |
| 723 --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface | 730 --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface |
| 724 end | 731 end |
| 725 | 732 |
| 726 local function addclient( addr, serverport, listener, pattern, sslctx, typ ) | 733 local function addclient( addr, serverport, listener, pattern, sslctx, typ, extra ) |
| 727 if sslctx and not has_luasec then | 734 if sslctx and not has_luasec then |
| 728 debug "need luasec, but not available" | 735 debug "need luasec, but not available" |
| 729 return nil, "luasec not found" | 736 return nil, "luasec not found" |
| 730 end | 737 end |
| 731 if not typ then | 738 if not typ then |
| 748 end | 755 end |
| 749 client:settimeout( 0 ) -- set nonblocking | 756 client:settimeout( 0 ) -- set nonblocking |
| 750 local res, err = client:setpeername( addr, serverport ) -- connect | 757 local res, err = client:setpeername( addr, serverport ) -- connect |
| 751 if res or ( err == "timeout" ) then | 758 if res or ( err == "timeout" ) then |
| 752 local ip, port = client:getsockname( ) | 759 local ip, port = client:getsockname( ) |
| 753 local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx ) | 760 local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx, extra ) |
| 754 debug( "new connection id:", interface.id ) | 761 debug( "new connection id:", interface.id ) |
| 755 return interface, err | 762 return interface, err |
| 756 else | 763 else |
| 757 debug( "new connection failed:", err ) | 764 debug( "new connection failed:", err ) |
| 758 return nil, err | 765 return nil, err |
