slitaz-base-files annotate rootfs/usr/lib/slitaz/httphelper @ rev 122

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