Software /
code /
prosody
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 |