comparison net/server_event.lua @ 13497:da9be0ad4bbc 0.12

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
author Kim Alvefur <zash@zash.se>
date Sun, 07 Jul 2024 18:28:17 +0200
parents 05c250fa335a
children aefbc76ac8d2
comparison
equal deleted inserted replaced
13492:dbf6e5404c7f 13497:da9be0ad4bbc
703 if interface._connections >= cfg.MAX_CONNECTIONS then 703 if interface._connections >= cfg.MAX_CONNECTIONS then
704 client:close( ) -- refuse connection 704 client:close( ) -- refuse connection
705 debug( "maximal connections reached, refuse client connection; accept delay:", delay ) 705 debug( "maximal connections reached, refuse client connection; accept delay:", delay )
706 return EV_TIMEOUT, delay -- delay for next accept attempt 706 return EV_TIMEOUT, delay -- delay for next accept attempt
707 end 707 end
708 local client_ip, client_port = client:getpeername( ) 708 local client_ip, client_port = addr, port;
709 if client.getpeername then -- Only IP sockets have this method, UNIX sockets don't
710 client_ip, client_port = client:getpeername( )
711 end
709 interface._connections = interface._connections + 1 -- increase connection count 712 interface._connections = interface._connections + 1 -- increase connection count
710 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx ) 713 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx )
711 --vdebug( "client id:", clientinterface, "startssl:", startssl ) 714 --vdebug( "client id:", clientinterface, "startssl:", startssl )
712 if has_luasec and startssl then 715 if has_luasec and startssl then
713 clientinterface:starttls(sslctx, true) 716 clientinterface:starttls(sslctx, true)
723 726
724 server:settimeout( 0 ) 727 server:settimeout( 0 )
725 setmetatable(interface, interface_mt) 728 setmetatable(interface, interface_mt)
726 interfacelist[ interface ] = true 729 interfacelist[ interface ] = true
727 interface:_start_session() 730 interface:_start_session()
731 return interface
732 end
733
734 local function wrapserver(conn, addr, port, listeners, config)
735 config = config or {}
736 if config.sslctx and not has_luasec then
737 debug "fatal error: luasec not found"
738 return nil, "luasec not found"
739 end
740 local interface = handleserver( conn, addr, port, config.read_size, listeners, config.tls_ctx, config.tls_direct) -- new server handler
741 debug( "new server created with id:", tostring(interface))
728 return interface 742 return interface
729 end 743 end
730 744
731 local function listen(addr, port, listener, config) 745 local function listen(addr, port, listener, config)
732 config = config or {} 746 config = config or {}
915 addevent = newevent, 929 addevent = newevent,
916 addserver = addserver, 930 addserver = addserver,
917 listen = listen, 931 listen = listen,
918 addclient = addclient, 932 addclient = addclient,
919 wrapclient = wrapclient, 933 wrapclient = wrapclient,
934 wrapserver = wrapserver,
920 setquitting = setquitting, 935 setquitting = setquitting,
921 closeall = closeallservers, 936 closeall = closeallservers,
922 get_backend = get_backend, 937 get_backend = get_backend,
923 hook_signal = hook_signal, 938 hook_signal = hook_signal,
924 add_task = add_task, 939 add_task = add_task,