| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | #!/bin/bashfunction fetch() {    dd of=/dev/null bs=1 count=$2 2>/dev/null    if ! [ -f "$1" -a -f "$1.ct" ]; then        echo -e "HTTP/1.1 404 Not Found\r"        echo -e "Content-Length: 0\r"        echo -e "\r"        return 0    fi    echo -e "HTTP/1.1 200 OK\r"    echo -e "Content-Type: `cat $1.ct`\r"    echo -e "Content-Length: `stat -c%s $1`\r"    echo -e "\r"    cat $1}function store() {    if [ -z "$3" ]; then        dd of=/dev/null bs=1 count=$2 2>/dev/null        echo -e "HTTP/1.1 400 Bad Request\r"        echo -e "Content-Length: 0\r"        echo -e "\r"    fi    dd of=$1 bs=1 count=$2 2>/dev/null    echo "$3" > $1.ct    echo -e "HTTP/1.1 200 OK\r"    echo -e "Content-Length: 0\r"    echo -e "\r"}function methd() {    dd of=/dev/null bs=1 count=$2 2>/dev/null    echo -e "HTTP/1.1 405 Method Not Allowed\r"    echo -e "Content-Length: 0\r"    echo -e "\r"}if [ $# -ne 1 ]; then    echo "Usage: `basename $0` STATEDIR" >&2    exit 1fishopt -s nocasematchwhile true; do    read meth path vers    [ -z "$meth" -a -z "$path" -a -z "$vers" ] && exit 0    [[ "$vers" =~ ^HTTP/1\.[01]$'\r'?$ ]] || exit 1    cl=0    while read h && [ "$h" != $'\r' ]; do        [[ "$h" =~ ^Content-Length:[[:blank:]]*([[:digit:]]+)[[:space:]]*$ ]] \            && cl=${BASH_REMATCH[1]}        [[ "$h" =~ ^Content-Type:[[:blank:]]*(.+)[[:blank:]]*$ ]] \            && ct=${BASH_REMATCH[1]}    done    echo "$meth $path" >&2    read path discard < <(echo "$path" | sha224sum)    case "$meth" in    GET)  fetch "$1/$path" "$cl";;    PUT)  store "$1/$path" "$cl" "$ct";;    POST) store "$1/$path" "$cl" "$ct";;    *)    methd "$1/$path" "$cl";;    esacdone
 |