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

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