net.server_event: Add 'wrapserver' API

This enables accepting admin stream socket (UNIX) connections trough the
same procedures as any other (TCP) socket, which avoids problems caused
by using the wrapclient API, which ends up discarding early data due to
only expecting early connection failure.

Fixes #1867
This commit is contained in:
Kim Alvefur 2024-07-07 18:28:17 +02:00
parent 11bc995c0b
commit ca417ab776

View file

@ -705,7 +705,10 @@ local function handleserver( server, addr, port, pattern, listener, sslctx, star
debug( "maximal connections reached, refuse client connection; accept delay:", delay ) debug( "maximal connections reached, refuse client connection; accept delay:", delay )
return EV_TIMEOUT, delay -- delay for next accept attempt return EV_TIMEOUT, delay -- delay for next accept attempt
end end
local client_ip, client_port = client:getpeername( ) local client_ip, client_port = addr, port;
if client.getpeername then -- Only IP sockets have this method, UNIX sockets don't
client_ip, client_port = client:getpeername( )
end
interface._connections = interface._connections + 1 -- increase connection count interface._connections = interface._connections + 1 -- increase connection count
local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx ) local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx )
--vdebug( "client id:", clientinterface, "startssl:", startssl ) --vdebug( "client id:", clientinterface, "startssl:", startssl )
@ -728,6 +731,17 @@ local function handleserver( server, addr, port, pattern, listener, sslctx, star
return interface return interface
end end
local function wrapserver(conn, addr, port, listeners, config)
config = config or {}
if config.sslctx and not has_luasec then
debug "fatal error: luasec not found"
return nil, "luasec not found"
end
local interface = handleserver( conn, addr, port, config.read_size, listeners, config.tls_ctx, config.tls_direct) -- new server handler
debug( "new server created with id:", tostring(interface))
return interface
end
local function listen(addr, port, listener, config) local function listen(addr, port, listener, config)
config = config or {} config = config or {}
if config.sslctx and not has_luasec then if config.sslctx and not has_luasec then
@ -917,6 +931,7 @@ return {
listen = listen, listen = listen,
addclient = addclient, addclient = addclient,
wrapclient = wrapclient, wrapclient = wrapclient,
wrapserver = wrapserver,
setquitting = setquitting, setquitting = setquitting,
closeall = closeallservers, closeall = closeallservers,
get_backend = get_backend, get_backend = get_backend,