Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/docs/ksh/scripts/cgi-lib.ksh.txt
1798 views
1
typeset -A COOKIE HEADER
2
typeset Cgi _CGI_c _CGI_multipart
3
4
function cgi_header
5
{
6
typeset h
7
for h in "${!HEADER[@]}"
8
do printf '%s: %s\n' "$h" "${HEADER[$h]}"
9
done
10
print
11
}
12
13
function cgi_url
14
{
15
if [[ $SERVER_PORT != 80 ]]
16
then print "http://$SERVER_NAME:$SERVER_PORT$SCRIPT_NAME"
17
else print "http://$SERVER_NAME$SCRIPT_NAME"
18
fi
19
}
20
21
function cgi_parse
22
{
23
if [[ $REQUEST_METHOD == POST ]]
24
then if [[ $CONTENT_TYPE == multipart/form-data* ]]
25
then _CGI_multipart=${TMPDIR-/tmp}/cgi-form-$$
26
trap 'rm -rf "$_CGI_multipart"' EXIT
27
mkdir $_CGI_multipart
28
unset -f Cgi.set
29
typeset -A Cgi.file
30
typeset i b v
31
pax --nosummary --read --edit ",.*/,," --edit ",^,$_CGI_multipart/,"
32
for i in $_CGI_multipart/*
33
do b=${i##*/}
34
if [[ $b == +([a-z]) ]]
35
then v=$(<$i)
36
eval Cgi.$b='$v'
37
else Cgi.file[$b]=$i
38
fi
39
done
40
else Cgi=$(<&0) # Read from stdin
41
fi
42
else Cgi="$QUERY_STRING"
43
fi
44
cgi_cookie "$HTTP_COOKIE"
45
HEADER["Content-type"]="text/html"
46
}
47
48
function cgi_cookie
49
{
50
typeset cookie=$1 name val c IFS=';'
51
set -- $cookie
52
for c
53
do
54
IFS='='
55
set -- $c
56
name=${1##' '} val=${2##' '} # trim white space
57
name=${name%%' '} val=${val%%' '}
58
COOKIE[$name]=$val
59
done
60
}
61
62
function cgi_setcookie # name value
63
{
64
HEADER["Set-Cookie"]="$1=$2; path=$SCRIPT_NAME"
65
}
66
67
## Cgi variable disciplines
68
69
function Cgi.set
70
{
71
set -f
72
typeset i j n val IFS='&'
73
set -- ${.sh.value}
74
for i
75
do n=${i%%=*}
76
[[ $n == [[:alpha:]_]*([[:alnum:]_]) ]] || continue
77
val=${i#$n=}
78
val=${val//+/ }
79
val=${val//@([\'\\])/'\'\1}
80
eval j=\${#${.sh.name}.${n}[@]} \
81
"${.sh.name}.${n}[j]=\$'${val//'%'@(??)/'\x'\1"'\$'"}'"
82
done
83
}
84
85
function cgi_C_init
86
{
87
integer i
88
for ((i=1; i < 256; i++))
89
do if (( i!=16#22 && i!=16#27 && i!=16#5C && i!=16#5B && i!=16#5D ))
90
then printf $'_CGI_c[$\'\\\\x%.2X\']=%%%.2X\n' $i $i
91
fi
92
done
93
print
94
}
95
96
function cgi_encode
97
{
98
typeset v=$1
99
var=${v//' '/+}
100
cbrace='}'
101
eval var=${var//@([!a-zA-Z0-9_+])/\${_CGI_c[\\\1]$cbrace}
102
print -r -- "$var"
103
}
104
105
function Cgi.get
106
{
107
typeset i val name vname
108
if [[ ! ${_CGI_c[\\]} ]]
109
then val='"'
110
_CGI_c[""]=%00
111
_CGI_c[$var]=%22
112
_CGI_c[\']=%27
113
_CGI_c[\]]=%5B
114
_CGI_c[\[]=%5D
115
_CGI_c[\\]=%5C
116
eval $(cgi_C_init)
117
unset -f cgi_C_init
118
fi
119
vname=${.sh.name} # .sh.name contains variable name
120
.sh.value= # .sh.value stores value
121
for i in ${!Cgi.@}
122
do
123
name=${i#$vname.}
124
nameref v=${i}
125
val=$(cgi_encode "$v")
126
.sh.value="${.sh.value}${.sh.value:+&}$name=$val"
127
done
128
}
129
130
131