From: paul Date: Mon, 29 Jul 2013 03:44:54 +0000 (+0000) Subject: some cgi parsing X-Git-Url: https://git.plutz.net/?p=confetti;a=commitdiff_plain;h=2a8ceba3e2a32940dafd3305237b4b519ef8781c some cgi parsing svn path=/trunk/; revision=3 --- diff --git a/cgi.sh b/cgi.sh new file mode 100755 index 0000000..cf0023c --- /dev/null +++ b/cgi.sh @@ -0,0 +1,23 @@ +#!/bin/zsh + +declare -A _GET +declare -A _POST + + +cgi_get() { # parse HTTP GET string + echo "$QUERY_STRING" |tr '&' '\n' |while read query; do + key="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')" + val="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')" + _GET["$key"]="$(echo -e "$(echo "$val" |sed 's:+: :g;s:%:\\x:g')")" + done + debug "$_GET" +} + +cgi_post() { # parse HTTP POST string + sed -u 1q |tr '&' '\n' |while read query; do + key="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')" + val="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')" + _POST["$key"]="$(echo -e "$(echo "$val" |sed 's:+: :g;s:%:\\x:g')")" + done + debug "$_POST" +} diff --git a/index.cgi b/index.cgi index 1188621..45602fc 100755 --- a/index.cgi +++ b/index.cgi @@ -10,8 +10,8 @@ debug() { #change to false to disable debugging } # this program is supposed to be symlinked into a http root directory -# we will use the http root as object storage and call sub programs -# from the directory in which the real executable resides +# we will use the http root as object storage (data directory) and call sub +# programs from the directory in which the real executable resides # therefore we need to identify the code and data directories _EXEC and _STOR call=$0 real=$call @@ -23,12 +23,12 @@ _EXEC="$(dirname "$real")" #execution directory _STOR="$(dirname "$call")" #storage directory debug "Execution dir: $_EXEC" -debug "Storage dir: $_EXEC" +debug "Storage dir: $_STOR" [ -w "$_EXEC" ] && [ -d "$_EXEC" ] || die "storage directory must be writable" # create directories for object storage -for each in "$_STOR"/{vcard,mappings}; do +for each in "$_STOR"/{vcard,mappings,courses}; do [ ! -e "$each" ] && mkdir "$each" [ -w "$each" ] && [ -d "$each" ] || die "storage $each must be a writable directory" done @@ -41,12 +41,8 @@ DirectoryIndex index.cgi EOF [ -f .htaccess ] || die "no htaccess file present and unable to create one" -# parse HTTP GET string -declare -A _GET -echo "$QUERY_STRING" |tr '&' '\n' |while read query; do - key="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')" - val="$(echo "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')" - _GET["$key"]="$(echo -e "$(echo "$val" |sed 's:+: :g;s:%:\\x:g')")" -done +. "$_EXEC/cgi.sh" + +cgi_get debug "$_GET"