123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- typeset -A COOKIE HEADER
- typeset Cgi _CGI_c _CGI_multipart
- function cgi_header
- {
- typeset h
- for h in "${!HEADER[@]}"
- do printf '%s: %s\n' "$h" "${HEADER[$h]}"
- done
- print
- }
- function cgi_url
- {
- if [[ $SERVER_PORT != 80 ]]
- then print "http://$SERVER_NAME:$SERVER_PORT$SCRIPT_NAME"
- else print "http://$SERVER_NAME$SCRIPT_NAME"
- fi
- }
- function cgi_parse
- {
- if [[ $REQUEST_METHOD == POST ]]
- then if [[ $CONTENT_TYPE == multipart/form-data* ]]
- then _CGI_multipart=${TMPDIR-/tmp}/cgi-form-$$
- trap 'rm -rf "$_CGI_multipart"' EXIT
- mkdir $_CGI_multipart
- unset -f Cgi.set
- typeset -A Cgi.file
- typeset i b v
- pax --nosummary --read --edit ",.*/,," --edit ",^,$_CGI_multipart/,"
- for i in $_CGI_multipart/*
- do b=${i##*/}
- if [[ $b == +([a-z]) ]]
- then v=$(<$i)
- eval Cgi.$b='$v'
- else Cgi.file[$b]=$i
- fi
- done
- else Cgi=$(<&0) # Read from stdin
- fi
- else Cgi="$QUERY_STRING"
- fi
- cgi_cookie "$HTTP_COOKIE"
- HEADER["Content-type"]="text/html"
- }
- function cgi_cookie
- {
- typeset cookie=$1 name val c IFS=';'
- set -- $cookie
- for c
- do
- IFS='='
- set -- $c
- name=${1##' '} val=${2##' '} # trim white space
- name=${name%%' '} val=${val%%' '}
- COOKIE[$name]=$val
- done
- }
- function cgi_setcookie # name value
- {
- HEADER["Set-Cookie"]="$1=$2; path=$SCRIPT_NAME"
- }
- ## Cgi variable disciplines
- function Cgi.set
- {
- set -f
- typeset i j n val IFS='&'
- set -- ${.sh.value}
- for i
- do n=${i%%=*}
- [[ $n == [[:alpha:]_]*([[:alnum:]_]) ]] || continue
- val=${i#$n=}
- val=${val//+/ }
- val=${val//@([\'\\])/'\'\1}
- eval j=\${#${.sh.name}.${n}[@]} \
- "${.sh.name}.${n}[j]=\$'${val//'%'@(??)/'\x'\1"'\$'"}'"
- done
- }
- function cgi_C_init
- {
- integer i
- for ((i=1; i < 256; i++))
- do if (( i!=16#22 && i!=16#27 && i!=16#5C && i!=16#5B && i!=16#5D ))
- then printf $'_CGI_c[$\'\\\\x%.2X\']=%%%.2X\n' $i $i
- fi
- done
- print
- }
- function cgi_encode
- {
- typeset v=$1
- var=${v//' '/+}
- cbrace='}'
- eval var=${var//@([!a-zA-Z0-9_+])/\${_CGI_c[\\\1]$cbrace}
- print -r -- "$var"
- }
- function Cgi.get
- {
- typeset i val name vname
- if [[ ! ${_CGI_c[\\]} ]]
- then val='"'
- _CGI_c[""]=%00
- _CGI_c[$var]=%22
- _CGI_c[\']=%27
- _CGI_c[\]]=%5B
- _CGI_c[\[]=%5D
- _CGI_c[\\]=%5C
- eval $(cgi_C_init)
- unset -f cgi_C_init
- fi
- vname=${.sh.name} # .sh.name contains variable name
- .sh.value= # .sh.value stores value
- for i in ${!Cgi.@}
- do
- name=${i#$vname.}
- nameref v=${i}
- val=$(cgi_encode "$v")
- .sh.value="${.sh.value}${.sh.value:+&}$name=$val"
- done
- }
|