Comparison

net/server_select.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
parent 9634:f457edaab510
child 11068:988ddd57e851
comparison
equal deleted inserted replaced
11061:45e1c467a3a7 11063:30d3f6f85eb8
262 end 262 end
263 end 263 end
264 return handler 264 return handler
265 end 265 end
266 266
267 wrapconnection = function( server, listeners, socket, ip, serverport, clientport, pattern, sslctx ) -- this function wraps a client to a handler object 267 wrapconnection = function( server, listeners, socket, ip, serverport, clientport, pattern, sslctx, extra ) -- this function wraps a client to a handler object
268 268
269 if socket:getfd() >= _maxfd then 269 if socket:getfd() >= _maxfd then
270 out_error("server.lua: Disallowed FD number: "..socket:getfd()) -- PROTIP: Switch to libevent 270 out_error("server.lua: Disallowed FD number: "..socket:getfd()) -- PROTIP: Switch to libevent
271 socket:close( ) -- Should we send some kind of error here? 271 socket:close( ) -- Should we send some kind of error here?
272 if server then 272 if server then
311 local maxreadlen = _maxreadlen 311 local maxreadlen = _maxreadlen
312 312
313 --// public methods of the object //-- 313 --// public methods of the object //--
314 314
315 local handler = bufferqueue -- saves a table ^_^ 315 local handler = bufferqueue -- saves a table ^_^
316
317 handler.extra = extra
318 if extra then
319 handler.servername = extra.servername
320 end
316 321
317 handler.dispatch = function( ) 322 handler.dispatch = function( )
318 return dispatch 323 return dispatch
319 end 324 end
320 handler.disconnect = function( ) 325 handler.disconnect = function( )
622 if not socket then 627 if not socket then
623 out_put( "server.lua: error while starting tls on client: ", tostring(err or "unknown error") ) 628 out_put( "server.lua: error while starting tls on client: ", tostring(err or "unknown error") )
624 return nil, err -- fatal error 629 return nil, err -- fatal error
625 end 630 end
626 631
632 if socket.sni and self.servername then
633 socket:sni(self.servername);
634 end
635
627 socket:settimeout( 0 ) 636 socket:settimeout( 0 )
628 637
629 -- add the new socket to our system 638 -- add the new socket to our system
630 send = socket.send 639 send = socket.send
631 receive = socket.receive 640 receive = socket.receive
975 return "select"; 984 return "select";
976 end 985 end
977 986
978 --// EXPERIMENTAL //-- 987 --// EXPERIMENTAL //--
979 988
980 local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx ) 989 local wrapclient = function( socket, ip, serverport, listeners, pattern, sslctx, extra )
981 local handler, socket, err = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx ) 990 local handler, socket, err = wrapconnection( nil, listeners, socket, ip, serverport, "clientport", pattern, sslctx, extra)
982 if not handler then return nil, err end 991 if not handler then return nil, err end
983 _socketlist[ socket ] = handler 992 _socketlist[ socket ] = handler
984 if not sslctx then 993 if not sslctx then
985 _readlistlen = addsocket(_readlist, socket, _readlistlen) 994 _readlistlen = addsocket(_readlist, socket, _readlistlen)
986 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen) 995 _sendlistlen = addsocket(_sendlist, socket, _sendlistlen)
995 end 1004 end
996 end 1005 end
997 return handler, socket 1006 return handler, socket
998 end 1007 end
999 1008
1000 local addclient = function( address, port, listeners, pattern, sslctx, typ ) 1009 local addclient = function( address, port, listeners, pattern, sslctx, typ, extra )
1001 local err 1010 local err
1002 if type( listeners ) ~= "table" then 1011 if type( listeners ) ~= "table" then
1003 err = "invalid listener table" 1012 err = "invalid listener table"
1004 elseif type ( address ) ~= "string" then 1013 elseif type ( address ) ~= "string" then
1005 err = "invalid address" 1014 err = "invalid address"
1032 return nil, err 1041 return nil, err
1033 end 1042 end
1034 client:settimeout( 0 ) 1043 client:settimeout( 0 )
1035 local ok, err = client:setpeername( address, port ) 1044 local ok, err = client:setpeername( address, port )
1036 if ok or err == "timeout" or err == "Operation already in progress" then 1045 if ok or err == "timeout" or err == "Operation already in progress" then
1037 return wrapclient( client, address, port, listeners, pattern, sslctx ) 1046 return wrapclient( client, address, port, listeners, pattern, sslctx, extra )
1038 else 1047 else
1039 return nil, err 1048 return nil, err
1040 end 1049 end
1041 end 1050 end
1042 1051