aboutsummaryrefslogtreecommitdiff
path: root/httpsvr
diff options
context:
space:
mode:
authorMitchell Riedstra <mitch@riedstra.dev>2021-10-24 18:52:44 -0400
committerMitchell Riedstra <mitch@riedstra.dev>2021-10-24 18:53:21 -0400
commitd7656842ac07f6fe639ce10d9235e8840bdd2102 (patch)
treef610b84768e4518fe620cf4d823700d0bb536150 /httpsvr
parentc760ce07dda4e87d673f5c025d4d4deff6717f9c (diff)
downloaddotfiles-d7656842ac07f6fe639ce10d9235e8840bdd2102.tar.gz
dotfiles-d7656842ac07f6fe639ce10d9235e8840bdd2102.tar.xz
A minimal toy http server in posix shell and openbsd netcat
Diffstat (limited to 'httpsvr')
-rwxr-xr-xhttpsvr69
1 files changed, 69 insertions, 0 deletions
diff --git a/httpsvr b/httpsvr
new file mode 100755
index 0000000..0ea8104
--- /dev/null
+++ b/httpsvr
@@ -0,0 +1,69 @@
+#!/bin/sh
+# Stupid basic http server using OpenBSD netcat
+set -e
+
+PORT="${PORT:-8900}"
+ADDR="${ADDR:-127.0.0.1}"
+
+ncpid=
+
+send_index() {
+cat <<EOF
+HTTP/1.1 200 OK
+Server: shell
+Content-Type: text/html; charset=UTF-8
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <title>Netcat HTTP</title>
+</head>
+<body>
+ Minimal HTTP server in posix SH and OpenBSD's netcat
+</body>
+</html>
+EOF
+}
+
+cleanup() {
+ set +e
+ kill "$ncpid" >/dev/null 2>&1
+ rm "$_f" "$_inF" >/dev/null 2>&1
+ exit 0
+}
+trap cleanup EXIT INT
+
+while true ; do
+ _f="$(mktemp)"
+
+ _inF="$(mktemp)"
+ rm -f "$_inF"
+ mkfifo "$_inF"
+
+ #shellcheck disable=SC2002
+ cat "$_inF" | nc -l "$ADDR" "$PORT" > "$_f" & # | tee /dev/fd/2 >"$_f" &
+ ncpid=$!
+
+ counter=0
+ while [ $counter -lt 100 ] || [ -s "$_f" ] ; do
+ if grep -qi "^Accept:" "$_f" ; then
+ pth="$(sed -nre 's@^GET ([^ ][^ ]*) HTTP/1.1.*@\1@gp' < "$_f")"
+
+ echo "Request for path: $pth"
+
+ case $pth in
+ /) send_index >"$_inF" ;;
+ esac
+
+ break
+ fi
+ sleep .01
+ sleep .1
+ [ -s "$_f" ] && counter=$((counter += 1))
+ ps $ncpid >/dev/null 2>&1 || break
+ done
+
+ kill $ncpid || echo ""
+ rm "$_f" "$_inF"
+done