wok view busybox/stuff/httpd_helper.sh @ rev 9597

busybox/httpd_helper.sh: add COOKIE support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Apr 13 13:28:56 2011 +0200 (2011-04-13)
parents fbc6ffdfe825
children 13ba44bf121e
line source
1 #!/bin/sh
2 #
3 # busybox/httpd helper for shell cgi scripts, providing:
4 #
5 # GET [var [index]] | POST [var [index]] | COOKIE [var [index]]
6 # FILE [var {name|tmpname|size|type}]
7 # header [strings]... | urlencode string | htmlentities string | httpinfo
8 #
10 alias urlencode='httpd -e'
12 # Send headers, example :
13 # header "Content-type: text/html" "Set-Cookie: name=value; HttpOnly"
14 header()
15 {
16 [ -z "$1" ] && set -- "Content-type: text/html"
17 for i in "$@" "" ; do echo -e "$i\r"; done
18 }
20 htmlentities()
21 {
22 echo $1 | sed 's|&|\&amp;|g;s|<|\&lt;|g;s|>|\&gt;|g;s|"|\&quot;|g'
23 }
25 _ARRAY()
26 {
27 [ -z "$2" ] && eval echo \$${1}__NAMES ||
28 [ -n "$(eval echo \$${1}__NAMES)" ] && eval echo \$${1}_${2}_${3:-1}
29 }
31 GET() { _ARRAY GET "$1" $2; }
32 POST() { _ARRAY POST "$1" $2; }
33 FILE() { _ARRAY FILE "$1" $2; }
34 COOKIE() { _ARRAY COOKIE "$1" $2; }
36 httpinfo()
37 {
38 local i
39 local x
40 for i in SERVER_PROTOCOL SERVER_SOFTWARE SERVER_NAME SERVER_PORT AUTH_TYPE \
41 GATEWAY_INTERFACE REMOTE_HOST REMOTE_ADDR REMOTE_PORT \
42 HTTP_REFERER HTTP_HOST HTTP_USER_AGENT HTTP_ACCEPT \
43 HTTP_ACCEPT_LANGUAGE HTTP_COOKIE AUTH_TYPE REMOTE_USER REMOTE_IDENT \
44 REQUEST_METHOD REQUEST_URI QUERY_STRING CONTENT_LENGTH CONTENT_TYPE \
45 SCRIPT_NAME SCRIPT_FILENAME PATH_INFO PATH_TRANSLATED \
46 USER HOME LOGNAME SHELL PWD ; do
47 eval x=\$$i
48 [ -n "$x" ] && echo "$i='$x'"
49 done
50 for n in GET POST COOKIE ; do
51 for i in $($n) ; do
52 if [ $($n $i count) -gt 1 ]; then
53 for j in $(seq 1 $($n $i count)); do
54 echo "$n($i,$j)='$($n $i $j)'"
55 done
56 else
57 echo "$n($i)='$($n $i)'"
58 fi
59 done
60 done
61 for i in $(FILE) ; do
62 for j in name size type tmpname ; do
63 echo "FILE($i,$j)='$(FILE $i $j)'"
64 done
65 done
66 }
68 read_query_string()
69 {
70 local i
71 local names
72 local cnt
73 names=""
74 IFS="&"
75 for i in $2 ; do
76 var=${i%%=*}
77 case " $names " in
78 *\ $var\ *) eval cnt=\$${1}_${var}_count ;;
79 *) cnt=0
80 names="$names $var" ;;
81 esac
82 eval ${1}_${var}_count=$((++cnt))
83 eval ${1}_${var}_$cnt=\'$(httpd -d "${i#*=}" | sed "s/'/\'\\\\\'\'/g")\'
84 done
85 unset IFS
86 eval ${1}__NAMES=\'${names# }\'
87 }
89 [ -z "$GET__NAMES" ] && read_query_string GET "$QUERY_STRING"
90 [ -z "$COOKIE_NAMES" ] &&
91 read_query_string COOKIE "$(echo "$HTTP_COOKIE" | sed 's/; /\&/g')"
93 ddcut()
94 {
95 page=4096
96 skip=$1
97 count=$(($2 - $1 -2))
98 tmp=$(($skip / $page))
99 [ $tmp -ne 0 ] && dd bs=$page skip=$tmp count=0
100 skip=$(($skip - ($tmp * $page) ))
101 dd bs=1 skip=$skip count=0
102 tmp=$(( ($page - $skip) % $page ))
103 if [ $tmp -ne 0 -a $tmp -le $count ]; then
104 dd bs=1 count=$tmp
105 count=$(($count - $tmp))
106 fi
107 tmp=$(($count / $page))
108 [ $tmp -ne 0 ] && dd bs=$page count=$tmp
109 dd bs=1 count=$(($count - ($tmp * $page) ))
110 }
112 if [ "$REQUEST_METHOD$POST__NAMES" == "POST" ]; then
113 prefix=/tmp/httpd_post
114 mkdir $prefix$$
115 now=$(stat -c %Y $prefix$$)
116 for i in $prefix* ; do
117 [ $(stat -c %Y $i) -lt $(($now - 3600)) ] && rm -rf $i
118 done
119 post=$prefix$$/post
120 n=1
121 cat > ${post}0
122 read delim < ${post}0
123 case "$delim" in
124 -*) awk "/${delim%?}/ { o+=index(\$0,\"$delim\")-1; print o }
125 { o+=1+length() }" < ${post}0 | while read offset; do
126 if [ $offset -ne 0 ]; then
127 ddcut $last $offset < ${post}0 > $post$n 2> /dev/null
128 n=$(($n+1))
129 fi
130 last=$offset
131 done
132 rm -f ${post}0
133 CR=`printf '\r'`
134 for i in $post* ; do
135 head -n 2 $i | grep -q filename= || echo '' >> $i
136 filename=
137 while read line; do
138 case "$line" in
139 *Content-Disposition*)
140 name=$(echo $line | sed 's/.* name="\([^"]*\)".*$/\1/')
141 case "$line" in
142 *filename=*) filename=$(echo $line | sed 's/.* filename="\([^"]*\)".*$/\1/') ;;
143 esac ;;
144 *Content-Type*)
145 type=$(echo $line | sed 's/.*-Type: \(.*\).$/\1/') ;;
146 $CR)
147 if [ -n "$filename" ]; then
148 tmp=$(mktemp $prefix$$/uploadXXXXXX)
149 cat > $tmp
150 FILE__NAMES="$FILE__NAMES $name"
151 FILE__NAMES="${FILE__NAMES# }"
152 eval FILE_${name}_tmpname=$tmp
153 eval FILE_${name}_name=$filename
154 eval FILE_${name}_size=$(stat -c %s $tmp)
155 eval FILE_${name}_type=$type
156 elif [ -n "$name" ]; then
157 eval var=\$POST_${name}
158 while read line; do
159 [ -n "$var" ] && var="$var
160 "
161 var="$line"
162 done
163 eval POST_${name}="\$var"
164 case " $POST__NAMES " in
165 *\ $name\ *) ;;
166 *) POST__NAMES="$POST__NAMES $name"
167 POST__NAMES="${POST__NAMES# }" ;;
168 esac
169 fi
170 break ;;
171 *)
172 esac
173 done < $i
174 rm -f $i
175 done
176 rmdir $(dirname $post) ;;
177 *) rm -rf $(dirname $post)
178 read_query_string POST "$delim" ;;
179 esac
180 fi