From 354616cc3536d7f0c58795373192f6b1e5a1cb0b Mon Sep 17 00:00:00 2001 From: dan Date: Sun, 28 May 2023 16:02:50 -0400 Subject: feat: shell script http server --- http-server.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 http-server.sh (limited to 'http-server.sh') diff --git a/http-server.sh b/http-server.sh new file mode 100644 index 0000000..aa5e17e --- /dev/null +++ b/http-server.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +# Simple HTTP Server using Netcat (nc) +# +# Sends a greeting message and the date in the response. + + +# Info: Relies on the OpenBSD version of Netcat +# GNU netcat may or may not work. + +# Creating a FIFO so that the output of nc can be processed and used to determine the input. +# Allows for "passing values back round" +outfifo="/tmp/outfifo" +rm -f "$outfifo" +mkfifo "$outfifo" + +# Run forever +while true; do + x="$(date)" + len="$(echo "$x" | wc -c)" + cat "$outfifo" \ + | nc -l localhost 1500 \ + | while read -r line; do + line=$(echo "$line" | tr -d '\r\n') + echo "< $line" + + if echo "$line" | grep -qE '^GET /'; then + # on reading the request line, extract a value from the request path and build the response + name="$(echo $line | sed 's:GET /\([^ ]*\).*:\1:')" + content="Hello $name, the date and time is $(date)." + # Without Content-Length header, connection will not close properly + len="$(echo "$content" | wc -c)" + + response="HTTP/1.1 200 OK\nContent-Length: $len\nContent-Type: plain/text\n\n$content" + elif [ -z "$line" ]; then # end of request + # send response once all of the request has been read + echo -e "$response" > "$outfifo" + fi + done + done -- cgit v1.2.3