1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #!/bin/bash
- function 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 1
- fi
- shopt -s nocasematch
- while 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";;
- esac
- done
|