28 May 2023
A sh HTTP Server, using Netcat
This kind of thing should not be used in any serious production application. For a start, there is a risk of shell injection attacks.
But I would bet that multiple S&P 500 companies use something like this, somewhere deep in the bowels of their systems.
A better choice of language is Go.
#!/bin/sh
# Simple HTTP Server using Netcat (nc)
#
# Sends a greeting message and the date in the response.
# Warning: 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
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="${#content}"
response="HTTP/1.1 200 OK\nContent-Length: $len\n\n$content"
elif [ -z "$line" ]; then # end of request
# send response once all of the request has been read
printf "%b" "$response" > "$outfifo"
fi
done
done