#!/bin/zsh
-# Copyright 2014 Paul Hänsch
+# Copyright 2014,2015 Paul Hänsch
#
-# This file is part of Serve0.
+# This file is part of shcgi.
#
-# Serve0 is free software: you can redistribute it and/or modify
+# shcgi is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
-# Serve0 is distributed in the hope that it will be useful,
+# shcgi is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
-# along with Serve0. If not, see <http://www.gnu.org/licenses/>.
+# along with shcgi. If not, see <http://www.gnu.org/licenses/>.
declare -A _GET
declare -A _POST
declare -A _REF
+[ -z "$HTTP_REFERER" ] && HTTP_REFERER="./"
+
cgi_get() { # parse HTTP GET string
+ debug "== CGI DATA: 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')")"
+ key="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')"
+ val="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')"
+ _GET["$key"]="$(echo -e "$(echo -E "$val" |sed 's:+: :g;s:\\:\\\\:g;s:%:\\x:g')")"
+ debug "_GET[$key] => $val"
done
}
cgi_post() { # parse HTTP POST string
+ debug "== CGI DATA: POST =="
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:')"
- value="$(echo -e "$(echo "$val" |sed 's:+: :g;s:%:\\x:g')")"
+ key="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')"
+ val="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')"
+ value="$(echo -e "$(echo -E "$val" |sed 's:+: :g;s:\\:\\\\:g;s:%:\\x:g;')")"
if [ -n "$_POST[\"$key\"]" ]; then
n=0
while [ -n "$_POST[\"$key$n\"]" ]; do n=$(($n + 1)); done
else
_POST["$key"]="$value"
fi
- #debug "_POST[$key] => $value"
+ debug "_POST[$key] => $value"
done
}
cgi_refdata() { # Parse GET data from referer
+ debug "== CGI DATA: REFERER =="
echo "$HTTP_REFERER" |cut -d'?' -f2- |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:')"
- _REF["$key"]="$(echo -e "$(echo "$val" |sed 's:+: :g;s:%:\\x:g')")"
+ key="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\1:')"
+ val="$(echo -E "$query" |sed -r 's:^([a-zA-Z0-9_-]*)=(.*)$:\2:')"
+ _REF["$key"]="$(echo -e "$(echo -E "$val" |sed 's:+: :g;s:\\:\\\\:g;s:%:\\x:g')")"
+ debug "_REF[$key] => $val"
done
}
# You should have received a copy of the GNU Affero General Public License
# along with shcgi. If not, see <http://www.gnu.org/licenses/>.
-export LC_ALL=C
+export LC_ALL=C LANG=C
+DBG_ENABLED=false
+DBG_FILE=/dev/stderr
# this program is supposed to be symlinked into a http root directory
# we will use the http root as object storage (data directory) and call sub
_DATA="$(dirname "$call")" #storage directory
_EXEC="${real%/shcgi/index.cgi}" #execution directory
+# put debug options in the local.opts file
+[ -r "$_DATA/local.opts" ] && . "$_DATA/local.opts"
+
# basic functions
-die() {
- echo "$@" >&2
- exit 1
+debug() { #change to false to disable debugging
+ if [ "$DBG_ENABLED" = true -a -n "$*" ]; then
+ echo -E "$@" >>"$DBG_FILE"
+ elif [ "$DBG_ENABLED" = true -a -z "$*" ]; then
+ tee -a "$DBG_FILE"
+ elif [ -z "$*" ]; then
+ cat
+ fi
}
-debug() { #change to false to disable debugging
- #true && echo "$*" >>debug
- true && [ -n "$*" ] && echo -E "$*" >>/dev/stderr
- true && [ -z "$*" ] && tee /dev/stderr
+die() {
+ debug "$@"
+ echo -E "$@" >>/dev/stderr
+ exit 1
}
data_dirs(){
#!/bin/zsh
-# Copyright 2014 Paul Hänsch
+# Copyright 2014,2015 Paul Hänsch
#
-# This file is part of Serve0.
+# This file is part of shcgi.
#
-# Serve0 is free software: you can redistribute it and/or modify
+# shcgi is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
-# Serve0 is distributed in the hope that it will be useful,
+# shcgi is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
-# along with Serve0. If not, see <http://www.gnu.org/licenses/>.
+# along with shcgi. If not, see <http://www.gnu.org/licenses/>.
echo -n "Content-Type: text/html;charset=utf-8\n\n"
-PAGE="$(echo "$_GET[\"p\"]" |egrep '^[a-zA-Z0-9_-]+$')"
+PAGE="$(echo -E "$_GET[\"p\"]" |egrep '^[a-zA-Z0-9_-]+$')"
PAGE="${_EXEC}/pages/${PAGE}.sh"
[ -x "$PAGE" ] || PAGE="${_EXEC}/pages/error.sh"
NAVIGATION() {
for each in "${_EXEC}"/pages/*.sh; do
- link="$(echo "$each" |sed -r "s:^.*/([^/]*)\.sh$:\1:")"
+ link="$(echo -E "$each" |sed -r "s:^.*/([^/]*)\.sh$:\1:")"
title="$($each title)"
- [ -n "$title" ] && echo "/?p=$link $title"
+ [ -n "$title" ] && echo -E "/?p=$link $title"
done
}