Mercurial > prosody-hg
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, |
