slitaz-base-files view rootfs/usr/lib/slitaz/httphelper @ rev 105

Add /usr/lib/slitaz/httphelper since Busybox removed upstream and we intensivly use it in SliTaz
author Christophe Lincoln <pankso@slitaz.org>
date Sat Mar 17 14:09:13 2012 +0100 (2012-03-17)
parents
children c2f69fa0c490
line source
1 #!/bin/sh
2 #
3 # SliTaz Helper for SHell CGI scripts - See httphelper function
4 #
5 # The initial script was found in Busybox 1.18.4 but was removed upstream
6 # it is used in TazPanel, Pizza and other SliTaz CGI tools and services.
7 # The goal is to maintain it according to the needs of the project and
8 # Busybox httpd server applet since it is used for URL [en|de]coding
9 #
10 # Copyright (C) SliTaz/Busybox 2012 - GNU gpl v2
11 #
13 alias urlencode='httpd -e'
14 alias urldecode='httpd -d'
16 # Help and usage.
17 httphelper() {
18 cat << EOT
20 Include this helper in a script:
21 . /usr/lib/slitaz/httphelper
23 Functions:
24 GET [var [index]]
25 POST [var [index]]
26 COOKIE [var [index]]
27 FILE [var {name|tmpname|size|type}]
28 header [strings]
29 urlencode string
30 urldecode string
31 htmlentities string
32 httpinfo
34 Example:
35 header "Content-type: text/html" "Set-Cookie: name=value; HttpOnly"
37 if [ "\$(GET name)" ]; then
38 echo "Input name have a value from HTML form"
39 fi
41 EOT
42 }
44 # Send headers.
45 header() {
46 local i
47 [ -z "$1" ] && set -- "Content-type: text/html"
48 for i in "$@" ""
49 do
50 echo -e "$i\r"
51 done
52 }
54 htmlentities() {
55 echo $1 | sed 's|&|\&amp;|g;s|<|\&lt;|g;s|>|\&gt;|g;s|"|\&quot;|g'
56 }
58 _ARRAY()
59 {
60 [ -z "$2" ] && eval echo \$${1}__NAMES ||
61 [ -n "$(eval echo \$${1}__NAMES)" ] && eval echo \$${1}_${2}_${3:-1}
62 }
64 GET() { _ARRAY GET "$1" $2; }
65 POST() { _ARRAY POST "$1" $2; }
66 FILE() { _ARRAY FILE "$1" $2; }
67 COOKIE() { _ARRAY COOKIE "$1" $2; }
69 httpinfo()
70 {
71 local i
72 local j
73 local x
74 for i in SERVER_PROTOCOL SERVER_SOFTWARE SERVER_NAME SERVER_PORT AUTH_TYPE \
75 GATEWAY_INTERFACE REMOTE_HOST REMOTE_ADDR REMOTE_PORT \
76 HTTP_REFERER HTTP_HOST HTTP_USER_AGENT HTTP_ACCEPT \
77 HTTP_ACCEPT_LANGUAGE HTTP_COOKIE AUTH_TYPE REMOTE_USER REMOTE_IDENT \
78 REQUEST_METHOD REQUEST_URI QUERY_STRING CONTENT_LENGTH CONTENT_TYPE \
79 SCRIPT_NAME SCRIPT_FILENAME PATH_INFO PATH_TRANSLATED \
80 USER HOME LOGNAME SHELL PWD ; do
81 eval x=\$$i
82 [ -n "$x" ] && echo "$i='$x'"
83 done
84 for x in GET POST COOKIE ; do
85 for i in $($x) ; do
86 if [ $($x $i count) -gt 1 ]; then
87 for j in $(seq 1 $($x $i count)); do
88 echo "$x($i,$j)='$($x $i $j)'"
89 done
90 else
91 echo "$x($i)='$($x $i)'"
92 fi
93 done
94 done
95 for i in $(FILE) ; do
96 for j in name size type tmpname ; do
97 echo "FILE($i,$j)='$(FILE $i $j)'"
98 done
99 done
100 }
102 read_query_string()
103 {
104 local i
105 local names
106 local cnt
107 names=""
108 IFS="&"
109 for i in $2 ; do
110 var=${i%%[^A-Za-z_0-9]*}
111 case " $names " in
112 *\ $var\ *) eval cnt=\$${1}_${var}_count ;;
113 *) cnt=0
114 names="$names $var" ;;
115 esac
116 eval ${1}_${var}_count=$((++cnt))
117 eval ${1}_${var}_$cnt=\'$(httpd -d "${i#*=}" | sed "s/'/\'\\\\\'\'/g")\'
118 done
119 unset IFS
120 eval ${1}__NAMES=\'${names# }\'
121 }
123 [ -z "$GET__NAMES" ] && read_query_string GET "$QUERY_STRING"
124 [ -z "$COOKIE_NAMES" ] &&
125 read_query_string COOKIE "$(echo "$HTTP_COOKIE" | sed 's/; /\&/g')"
127 ddcut()
128 {
129 page=4096
130 skip=$1
131 count=$(($2 - $1 -2))
132 tmp=$(($skip / $page))
133 [ $tmp -ne 0 ] && dd bs=$page skip=$tmp count=0
134 skip=$(($skip - ($tmp * $page) ))
135 dd bs=1 skip=$skip count=0
136 tmp=$(( ($page - $skip) % $page ))
137 if [ $tmp -ne 0 -a $tmp -le $count ]; then
138 dd bs=1 count=$tmp
139 count=$(($count - $tmp))
140 fi
141 tmp=$(($count / $page))
142 [ $tmp -ne 0 ] && dd bs=$page count=$tmp
143 dd bs=1 count=$(($count - ($tmp * $page) ))
144 }
146 if [ "$REQUEST_METHOD$POST__NAMES" == "POST" ]; then
147 prefix=/tmp/httpd_post
148 mkdir $prefix$$
149 now=$(stat -c %Y $prefix$$)
150 for i in $prefix* ; do
151 [ $(stat -c %Y $i) -lt $(($now - 3600)) ] && rm -rf $i
152 done
153 post=$prefix$$/post
154 n=1
155 cat > ${post}0
156 read delim < ${post}0
157 delim=${delim%?}
158 case "$delim" in
159 -*) awk "/$delim/ { o+=index(\$0,\"$delim\")-1; print o }
160 { o+=1+length() }" < ${post}0 | while read offset; do
161 if [ $offset -ne 0 ]; then
162 ddcut $last $offset < ${post}0 > $post$n 2> /dev/null
163 n=$(($n+1))
164 fi
165 last=$offset
166 done
167 rm -f ${post}0
168 CR=`printf '\r'`
169 for i in $post* ; do
170 head -n 2 $i | grep -q filename= || echo '' >> $i
171 filename=
172 while read line; do
173 case "$line" in
174 *Content-Disposition*)
175 name=$(echo $line | sed 's/.* name="\([^"]*\)".*$/\1/')
176 name=${name%%[^A-Za-z_0-9]*}
177 case "$line" in
178 *filename=*) filename=$(echo $line | sed 's/.* filename="\([^"]*\)".*$/\1/') ;;
179 esac ;;
180 *Content-Type*)
181 type=$(echo $line | sed 's/.*-Type: \(.*\).$/\1/') ;;
182 $CR)
183 if [ -n "$filename" ]; then
184 tmp=$(mktemp $prefix$$/uploadXXXXXX)
185 cat > $tmp
186 FILE__NAMES="$FILE__NAMES $name"
187 FILE__NAMES="${FILE__NAMES# }"
188 eval FILE_${name}_tmpname=$tmp
189 eval FILE_${name}_name=$filename
190 eval FILE_${name}_size=$(stat -c %s $tmp)
191 eval FILE_${name}_type=$type
192 elif [ -n "$name" ]; then
193 eval cnt=\$POST_${name}_count
194 cnt=$(($cnt + 1))
195 eval var=\$POST_${name}_$cnt
196 while read line; do
197 [ -n "$var" ] && var="$var
198 "
199 var="$var$line"
200 done
201 eval POST_${name}_$cnt="\$var"
202 eval POST_${name}_count=$cnt
203 case " $POST__NAMES " in
204 *\ $name\ *) ;;
205 *) POST__NAMES="$POST__NAMES $name"
206 POST__NAMES="${POST__NAMES# }" ;;
207 esac
208 fi
209 break ;;
210 *)
211 esac
212 done < $i
213 rm -f $i
214 done
215 rmdir $(dirname $post) ;;
216 *) rm -rf $(dirname $post)
217 read_query_string POST "$delim" ;;
218 esac
219 fi
221 case "$1" in
222 usage|help)
223 httphelper ;;
224 esac