#!/bin/sh

set -uex

export PATH="/sbin:/usr/sbin:$PATH"

DOCROOT="$AUTOPKGTEST_TMP/docroot"
mkdir p "$DOCROOT"
ECHO_SCRIPT="$DOCROOT/echo.pl"
cat > "$ECHO_SCRIPT" <<'EOF'
#!/usr/bin/perl -Tw
$SIG{PIPE} = 'IGNORE';
for (my $FH; accept($FH, STDIN); close $FH) {
    select($FH); $|=1; # $FH->autoflush;
    print $FH $_ while (<$FH>);
}
EOF
chmod +x "$ECHO_SCRIPT"
CONF="$AUTOPKGTEST_TMP/lighttpd.conf"
cat >"$CONF" <<EOF
server.document-root = "$DOCROOT"
server.port = 3000
server.modules += ("mod_wstunnel")
wstunnel.server = (
  "/ws/" => (
    (
      "socket" => "/dev/shm/psock",
      "bin-path" => "$ECHO_SCRIPT",
      "max-procs" => 1
    )
  )
)
EOF

lighttpd -D -f "$CONF" &
LIGHTTPD_PID=$!
trap 'kill $LIGHTTPD_PID' EXIT
sleep 1
# issue request with bad Sec-WebSocket-Version
printf "GET /ws/ HTTP/1.1\r\nHost: localhost\r\nSec-WebSocket-Version: x\r\nSec-WebSocket-Extensions: permessage-deflate\r\nSec-WebSocket-Key: FCM5bSXLZW322otNERLYNA==\r\nConnection: keep-alive, Upgrade\r\nSec-Fetch-Dest: websocket\r\nSec-Fetch-Mode: websocket\r\nSec-Fetch-Site: same-origin\r\nUpgrade: websocket\r\n\r\n" | socat stdio tcp-connect:127.0.0.1:3000
# lighttpd should not crash
ps "$LIGHTTPD_PID"
# count open file descriptors after first request
FDCOUNT=$(ls "/proc/$LIGHTTPD_PID/fd" | wc -l)
# second request to test for resource leaks
printf "GET /ws/ HTTP/1.1\r\nHost: localhost\r\nSec-WebSocket-Version: x\r\nSec-WebSocket-Extensions: permessage-deflate\r\nSec-WebSocket-Key: FCM5bSXLZW322otNERLYNA==\r\nConnection: keep-alive, Upgrade\r\nSec-Fetch-Dest: websocket\r\nSec-Fetch-Mode: websocket\r\nSec-Fetch-Site: same-origin\r\nUpgrade: websocket\r\n\r\n" | socat stdio tcp-connect:127.0.0.1:3000
sleep 1
ps "$LIGHTTPD_PID"
if test "$(ls "/proc/$LIGHTTPD_PID/fd" | wc -l)" -ne "$FDCOUNT"; then
	echo failing test due to leaked connection
	exit 1
fi
