84 lines
1.9 KiB
Bash
Executable File
84 lines
1.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
### Create the response FIFO
|
|
rm -f response
|
|
mkfifo response
|
|
|
|
function handle_GET_home() {
|
|
RESPONSE=$(cat home.html |
|
|
sed "s/{{$COOKIE_NAME}}/$COOKIE_VALUE/")
|
|
}
|
|
|
|
function handle_GET_login() {
|
|
RESPONSE=$(cat login.html)
|
|
}
|
|
|
|
function handle_POST_login() {
|
|
RESPONSE=$(cat post-login.http |
|
|
sed "s/{{cookie_name}}/$INPUT_NAME/" |
|
|
sed "s/{{cookie_value}}/$INPUT_VALUE/")
|
|
}
|
|
|
|
function handle_POST_logout() {
|
|
RESPONSE=$(cat post-logout.http |
|
|
sed "s/{{cookie_name}}/$COOKIE_NAME/" |
|
|
sed "s/{{cookie_value}}/$COOKIE_VALUE/")
|
|
}
|
|
|
|
function handle_not_found() {
|
|
RESPONSE=$(cat 404.html)
|
|
}
|
|
|
|
function handleRequest() {
|
|
## Read request
|
|
while read line; do
|
|
echo $line
|
|
trline=$(echo $line | tr -d '[\r\n]')
|
|
|
|
[ -z "$trline" ] && break
|
|
|
|
HEADLINE_REGEX='(.*?)\s(.*?)\sHTTP.*?'
|
|
[[ "$trline" =~ $HEADLINE_REGEX ]] &&
|
|
REQUEST=$(echo $trline | sed -E "s/$HEADLINE_REGEX/\1 \2/")
|
|
|
|
CONTENT_LENGTH_REGEX='Content-Length:\s(.*?)'
|
|
[[ "$trline" =~ $CONTENT_LENGTH_REGEX ]] &&
|
|
CONTENT_LENGTH=$(echo $trline | sed -E "s/$CONTENT_LENGTH_REGEX/\1/")
|
|
|
|
COOKIE_REGEX='Cookie:\s(.*?)\=(.*?).*?'
|
|
[[ "$trline" =~ $COOKIE_REGEX ]] &&
|
|
read COOKIE_NAME COOKIE_VALUE <<<$(echo $trline | sed -E "s/$COOKIE_REGEX/\1 \2/")
|
|
done
|
|
|
|
## Read body
|
|
if [ ! -z "$CONTENT_LENGTH" ]; then
|
|
BODY_REGEX='(.*?)=(.*?)'
|
|
|
|
while read -n$CONTENT_LENGTH -t1 line; do
|
|
echo $line
|
|
trline=$(echo $line | tr -d '[\r\n]')
|
|
|
|
[ -z "$trline" ] && break
|
|
|
|
read INPUT_NAME INPUT_VALUE <<<$(echo $trline | sed -E "s/$BODY_REGEX/\1 \2/")
|
|
done
|
|
fi
|
|
|
|
## Route to the response handlers
|
|
case "$REQUEST" in
|
|
"GET /login") handle_GET_login ;;
|
|
"GET /") handle_GET_home ;;
|
|
"POST /login") handle_POST_login ;;
|
|
"POST /logout") handle_POST_logout ;;
|
|
*) handle_not_found ;;
|
|
esac
|
|
|
|
echo -e "$RESPONSE" >response
|
|
}
|
|
|
|
echo 'Listening on 3000...'
|
|
|
|
while true; do
|
|
cat response | nc -lN 3000 | handleRequest
|
|
done
|