http
This commit is contained in:
parent
1317f6f617
commit
e50e0f30ce
97
http/http_bash.sh
Executable file
97
http/http_bash.sh
Executable file
@ -0,0 +1,97 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# A simple, configurable HTTP server written in bash.
|
||||||
|
#
|
||||||
|
# See LICENSE for licensing information.
|
||||||
|
#
|
||||||
|
# Original author: Avleen Vig, 2012
|
||||||
|
# Reworked by: Josh Cartwright, 2012
|
||||||
|
|
||||||
|
warn() { echo "WARNING: $@" >&2; }
|
||||||
|
|
||||||
|
recv() { echo "< $@" >&2; }
|
||||||
|
send() { echo "> $@" >&2;
|
||||||
|
printf '%s\r\n' "$*"; }
|
||||||
|
|
||||||
|
[[ $UID = 0 ]] && warn "It is not recommended to run bashttpd as root."
|
||||||
|
|
||||||
|
DATE=$(date +"%a, %d %b %Y %H:%M:%S %Z")
|
||||||
|
declare -a RESPONSE_HEADERS=(
|
||||||
|
"Date: $DATE"
|
||||||
|
"Expires: $DATE"
|
||||||
|
"Server: Slash Bin Slash Bash"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_response_header() {
|
||||||
|
RESPONSE_HEADERS+=("$1: $2")
|
||||||
|
}
|
||||||
|
|
||||||
|
declare -a HTTP_RESPONSE=(
|
||||||
|
[200]="OK"
|
||||||
|
[400]="Bad Request"
|
||||||
|
[403]="Forbidden"
|
||||||
|
[404]="Not Found"
|
||||||
|
[405]="Method Not Allowed"
|
||||||
|
[500]="Internal Server Error"
|
||||||
|
)
|
||||||
|
|
||||||
|
send_response() {
|
||||||
|
local code=$1
|
||||||
|
send "HTTP/1.0 $1 ${HTTP_RESPONSE[$1]}"
|
||||||
|
for i in "${RESPONSE_HEADERS[@]}"; do
|
||||||
|
send "$i"
|
||||||
|
done
|
||||||
|
send
|
||||||
|
while read -r line; do
|
||||||
|
send "$line"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
send_response_ok_exit() { send_response 200; exit 0; }
|
||||||
|
|
||||||
|
fail_with() {
|
||||||
|
send_response "$1" <<< "$1 ${HTTP_RESPONSE[$1]}"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
serve_static_string() {
|
||||||
|
add_response_header "Content-Type" "text/plain;charset=utf-8"
|
||||||
|
send_response_ok_exit <<< "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
main () {
|
||||||
|
[ -x "$REQUEST_URI" ] || [ ! -d "$REQUEST_URI" ] || fail_with 404
|
||||||
|
serve_static_string "$(basename "$REQUEST_URI" | cut -d '.' -f 1) : $(sh "$REQUEST_URI" 2>&1 && echo Ok || echo 'Non validé')"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Request-Line HTTP RFC 2616 $5.1
|
||||||
|
read -r line || fail_with 400
|
||||||
|
|
||||||
|
# strip trailing CR if it exists
|
||||||
|
line=${line%%$'\r'}
|
||||||
|
recv "$line"
|
||||||
|
|
||||||
|
read -r REQUEST_METHOD REQUEST_URI REQUEST_HTTP_VERSION <<<"$line"
|
||||||
|
|
||||||
|
[ -n "$REQUEST_METHOD" ] && \
|
||||||
|
[ -n "$REQUEST_URI" ] && \
|
||||||
|
[ -n "$REQUEST_HTTP_VERSION" ] \
|
||||||
|
|| fail_with 400
|
||||||
|
|
||||||
|
# Only GET is supported at this time
|
||||||
|
[ "$REQUEST_METHOD" = "GET" ] || fail_with 405
|
||||||
|
|
||||||
|
declare -a REQUEST_HEADERS
|
||||||
|
|
||||||
|
while read -r line; do
|
||||||
|
line=${line%%$'\r'}
|
||||||
|
recv "$line"
|
||||||
|
|
||||||
|
# If we've reached the end of the headers, break.
|
||||||
|
[ -z "$line" ] && break
|
||||||
|
|
||||||
|
REQUEST_HEADERS+=("$line")
|
||||||
|
done
|
||||||
|
|
||||||
|
main
|
||||||
|
|
||||||
|
fail_with 500
|
Loading…
Reference in New Issue
Block a user