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

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