#!/usr/local/bin/bash
#
# by shudder <shudder@gbg.bg>
#
# after initcgi is executed, form contents
# can be used like normal shell variables
#
# the environment is made readonly by default
# to prevent your scripts from lamish hacks
# you could pass NORMAL as an argumet to initcgi to
# leave it read-write (not suggested)
#
# both GET and POST are supported

set -f # disable globbing

function decode {   # neat!
  if [ "$*" ]; then
  echo $* | sed "s/+/ /g;s/%20/ /g;s/%21/!/g;s/%22/\"/g;s/%23/#/g;s/%24/\$\
/g;s/%25/%/g;s/%26/&/g;s/%27/'/g;s/%28/(/g;s/%29/)/g;s/%2A/\*/g;s/%2B/+/g;\
s/%2C/,/g;s/%2D/-/g;s/%2E/./g;s/%2F/\//g;s/%30/0/g;s/%31/1/g;s/%32/2/g;s/%\
33/3/g;s/%34/4/g;s/%35/5/g;s/%36/6/g;s/%37/7/g;s/%38/8/g;s/%39/9/g;s/%3A/:\
/g;s/%3B/\;/g;s/%3C/</g;s/%3D/=/g;s/%3E/>/g;s/%3F/?/g;s/%40/@/g;s/%41/A/g;\
s/%42/B/g;s/%43/C/g;s/%44/D/g;s/%45/E/g;s/%46/F/g;s/%47/G/g;s/%48/H/g;s/%4\
9/I/g;s/%4A/J/g;s/%4B/K/g;s/%4C/L/g;s/%4D/M/g;s/%4E/N/g;s/%4F/O/g;s/%50/P/\
g;s/%51/Q/g;s/%52/R/g;s/%53/S/g;s/%54/T/g;s/%55/U/g;s/%56/V/g;s/%57/W/g;s/\
%58/X/g;s/%59/Y/g;s/%5A/Z/g;s/%5B/[/g;s/%5C/\\\/g;s/%5D/\]/g;s/%5E/^/g;s/%\
5F/_/g;s/%60/\`/g;s/%61/a/g;s/%62/b/g;s/%63/c/g;s/%64/d/g;s/%65/e/g;s/%66/\
f/g;s/%67/g/g;s/%68/h/g;s/%69/i/g;s/%6A/j/g;s/%6B/k/g;s/%6C/l/g;s/%6D/m/g;\
s/%6E/n/g;s/%6F/o/g;s/%70/p/g;s/%71/q/g;s/%72/r/g;s/%73/s/g;s/%74/t/g;s/%7\
5/u/g;s/%76/v/g;s/%77/w/g;s/%78/x/g;s/%79/y/g;s/%7A/z/g;s/%7B/{/g;s/%7C/|/\
g;s/%7D/}/g;s/%7E/~/g;s/%0D%0A/ /g"
  fi
}

function initcgi {
  local _data _var

  if [ "$REQUEST_METHOD" = "GET" ]; then
    _data="$QUERY_STRING"
  elif [ "$REQUEST_METHOD" = "POST" ]; then
    if [ "$CONTENT_LENGTH" ]; then
      read _data
    fi
  else
    echo "Content-type: text/plain"
    echo
    echo "Unknown method: ${REQUEST_METHOD:-method not specified}"
    exit 1
  fi

  if [ "$1" != "NORMAL" ]; then
    for _var in $(env | sed "s/ //g"); do # make environment read-only
      [ "${_var/=*/}" != "_" ] && readonly ${_var/=*/}
    done
  fi

  set -- ${_data//&/ }
  while [ "$1" ]; do
    export $(echo ${1/=*/})="$(decode ${1/*=/})" 2> /dev/null
    shift 1
  done
}

