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