diff options
| author | Mitchell Riedstra <mitch@riedstra.dev> | 2021-10-24 18:52:44 -0400 |
|---|---|---|
| committer | Mitchell Riedstra <mitch@riedstra.dev> | 2021-10-24 18:53:21 -0400 |
| commit | d7656842ac07f6fe639ce10d9235e8840bdd2102 (patch) | |
| tree | f610b84768e4518fe620cf4d823700d0bb536150 /httpsvr | |
| parent | c760ce07dda4e87d673f5c025d4d4deff6717f9c (diff) | |
| download | dotfiles-d7656842ac07f6fe639ce10d9235e8840bdd2102.tar.gz dotfiles-d7656842ac07f6fe639ce10d9235e8840bdd2102.tar.xz | |
A minimal toy http server in posix shell and openbsd netcat
Diffstat (limited to 'httpsvr')
| -rwxr-xr-x | httpsvr | 69 |
1 files changed, 69 insertions, 0 deletions
@@ -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 |
