diff options
author | Kim Alvefur <zash@zash.se> | 2024-07-07 18:28:17 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2024-07-07 18:28:17 +0200 |
commit | ca417ab7767b3ba8f62bdbdbd51f306f159375ea (patch) | |
tree | bd4e5c27a51d8e79e8cb1fd351522827517900d8 | |
parent | 11bc995c0b0009dda6ba5dec031255fee13ea113 (diff) | |
download | prosody-ca417ab7767b3ba8f62bdbdbd51f306f159375ea.tar.gz prosody-ca417ab7767b3ba8f62bdbdbd51f306f159375ea.zip |
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
-rw-r--r-- | net/server_event.lua | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/net/server_event.lua b/net/server_event.lua index c30181b8..e0235121 100644 --- a/net/server_event.lua +++ b/net/server_event.lua @@ -705,7 +705,10 @@ local function handleserver( server, addr, port, pattern, listener, sslctx, star debug( "maximal connections reached, refuse client connection; accept delay:", delay ) return EV_TIMEOUT, delay -- delay for next accept attempt 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 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx ) --vdebug( "client id:", clientinterface, "startssl:", startssl ) @@ -728,6 +731,17 @@ local function handleserver( server, addr, port, pattern, listener, sslctx, star return interface 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) config = config or {} if config.sslctx and not has_luasec then @@ -917,6 +931,7 @@ return { listen = listen, addclient = addclient, wrapclient = wrapclient, + wrapserver = wrapserver, setquitting = setquitting, closeall = closeallservers, get_backend = get_backend, |