wok-undigest diff busybox/stuff/httpd_helper.sh @ rev 601
Move libextractor to wok
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Dec 25 15:20:34 2011 +0100 (2011-12-25) |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/busybox/stuff/httpd_helper.sh Sun Dec 25 15:20:34 2011 +0100 1.3 @@ -0,0 +1,187 @@ 1.4 +#!/bin/sh 1.5 +# 1.6 +# busybox/httpd helper for shell cgi scripts, providing: 1.7 +# 1.8 +# GET [var [index]] | POST [var [index]] | COOKIE [var [index]] 1.9 +# FILE [var {name|tmpname|size|type}] 1.10 +# header [strings]... | urlencode string | htmlentities string | httpinfo 1.11 +# 1.12 + 1.13 +alias urlencode='httpd -e' 1.14 + 1.15 +# Send headers, example : 1.16 +# header "Content-type: text/html" "Set-Cookie: name=value; HttpOnly" 1.17 +header() 1.18 +{ 1.19 +local i 1.20 +[ -z "$1" ] && set -- "Content-type: text/html" 1.21 +for i in "$@" "" ; do echo -e "$i\r"; done 1.22 +} 1.23 + 1.24 +htmlentities() 1.25 +{ 1.26 +echo $1 | sed 's|&|\&|g;s|<|\<|g;s|>|\>|g;s|"|\"|g' 1.27 +} 1.28 + 1.29 +_ARRAY() 1.30 +{ 1.31 +[ -z "$2" ] && eval echo \$${1}__NAMES || 1.32 + [ -n "$(eval echo \$${1}__NAMES)" ] && eval echo \$${1}_${2}_${3:-1} 1.33 +} 1.34 + 1.35 +GET() { _ARRAY GET "$1" $2; } 1.36 +POST() { _ARRAY POST "$1" $2; } 1.37 +FILE() { _ARRAY FILE "$1" $2; } 1.38 +COOKIE() { _ARRAY COOKIE "$1" $2; } 1.39 + 1.40 +httpinfo() 1.41 +{ 1.42 +local i 1.43 +local j 1.44 +local x 1.45 +for i in SERVER_PROTOCOL SERVER_SOFTWARE SERVER_NAME SERVER_PORT AUTH_TYPE \ 1.46 + GATEWAY_INTERFACE REMOTE_HOST REMOTE_ADDR REMOTE_PORT \ 1.47 + HTTP_REFERER HTTP_HOST HTTP_USER_AGENT HTTP_ACCEPT \ 1.48 + HTTP_ACCEPT_LANGUAGE HTTP_COOKIE AUTH_TYPE REMOTE_USER REMOTE_IDENT \ 1.49 + REQUEST_METHOD REQUEST_URI QUERY_STRING CONTENT_LENGTH CONTENT_TYPE \ 1.50 + SCRIPT_NAME SCRIPT_FILENAME PATH_INFO PATH_TRANSLATED \ 1.51 + USER HOME LOGNAME SHELL PWD ; do 1.52 + eval x=\$$i 1.53 + [ -n "$x" ] && echo "$i='$x'" 1.54 +done 1.55 +for x in GET POST COOKIE ; do 1.56 + for i in $($x) ; do 1.57 + if [ $($x $i count) -gt 1 ]; then 1.58 + for j in $(seq 1 $($x $i count)); do 1.59 + echo "$x($i,$j)='$($x $i $j)'" 1.60 + done 1.61 + else 1.62 + echo "$x($i)='$($x $i)'" 1.63 + fi 1.64 + done 1.65 +done 1.66 +for i in $(FILE) ; do 1.67 + for j in name size type tmpname ; do 1.68 + echo "FILE($i,$j)='$(FILE $i $j)'" 1.69 + done 1.70 +done 1.71 +} 1.72 + 1.73 +read_query_string() 1.74 +{ 1.75 +local i 1.76 +local names 1.77 +local cnt 1.78 +names="" 1.79 +IFS="&" 1.80 +for i in $2 ; do 1.81 + var=${i%%[^A-Za-z_0-9]*} 1.82 + case " $names " in 1.83 + *\ $var\ *) eval cnt=\$${1}_${var}_count ;; 1.84 + *) cnt=0 1.85 + names="$names $var" ;; 1.86 + esac 1.87 + eval ${1}_${var}_count=$((++cnt)) 1.88 + eval ${1}_${var}_$cnt=\'$(httpd -d "${i#*=}" | sed "s/'/\'\\\\\'\'/g")\' 1.89 +done 1.90 +unset IFS 1.91 +eval ${1}__NAMES=\'${names# }\' 1.92 +} 1.93 + 1.94 +[ -z "$GET__NAMES" ] && read_query_string GET "$QUERY_STRING" 1.95 +[ -z "$COOKIE_NAMES" ] && 1.96 + read_query_string COOKIE "$(echo "$HTTP_COOKIE" | sed 's/; /\&/g')" 1.97 + 1.98 +ddcut() 1.99 +{ 1.100 +page=4096 1.101 +skip=$1 1.102 +count=$(($2 - $1 -2)) 1.103 +tmp=$(($skip / $page)) 1.104 +[ $tmp -ne 0 ] && dd bs=$page skip=$tmp count=0 1.105 +skip=$(($skip - ($tmp * $page) )) 1.106 +dd bs=1 skip=$skip count=0 1.107 +tmp=$(( ($page - $skip) % $page )) 1.108 +if [ $tmp -ne 0 -a $tmp -le $count ]; then 1.109 + dd bs=1 count=$tmp 1.110 + count=$(($count - $tmp)) 1.111 +fi 1.112 +tmp=$(($count / $page)) 1.113 +[ $tmp -ne 0 ] && dd bs=$page count=$tmp 1.114 +dd bs=1 count=$(($count - ($tmp * $page) )) 1.115 +} 1.116 + 1.117 +if [ "$REQUEST_METHOD$POST__NAMES" == "POST" ]; then 1.118 + prefix=/tmp/httpd_post 1.119 + mkdir $prefix$$ 1.120 + now=$(stat -c %Y $prefix$$) 1.121 + for i in $prefix* ; do 1.122 + [ $(stat -c %Y $i) -lt $(($now - 3600)) ] && rm -rf $i 1.123 + done 1.124 + post=$prefix$$/post 1.125 + n=1 1.126 + cat > ${post}0 1.127 + read delim < ${post}0 1.128 + delim=${delim%?} 1.129 + case "$delim" in 1.130 + -*) awk "/$delim/ { o+=index(\$0,\"$delim\")-1; print o } 1.131 + { o+=1+length() }" < ${post}0 | while read offset; do 1.132 + if [ $offset -ne 0 ]; then 1.133 + ddcut $last $offset < ${post}0 > $post$n 2> /dev/null 1.134 + n=$(($n+1)) 1.135 + fi 1.136 + last=$offset 1.137 + done 1.138 + rm -f ${post}0 1.139 + CR=`printf '\r'` 1.140 + for i in $post* ; do 1.141 + head -n 2 $i | grep -q filename= || echo '' >> $i 1.142 + filename= 1.143 + while read line; do 1.144 + case "$line" in 1.145 + *Content-Disposition*) 1.146 + name=$(echo $line | sed 's/.* name="\([^"]*\)".*$/\1/') 1.147 + name=${name%%[^A-Za-z_0-9]*} 1.148 + case "$line" in 1.149 + *filename=*) filename=$(echo $line | sed 's/.* filename="\([^"]*\)".*$/\1/') ;; 1.150 + esac ;; 1.151 + *Content-Type*) 1.152 + type=$(echo $line | sed 's/.*-Type: \(.*\).$/\1/') ;; 1.153 + $CR) 1.154 + if [ -n "$filename" ]; then 1.155 + tmp=$(mktemp $prefix$$/uploadXXXXXX) 1.156 + cat > $tmp 1.157 + FILE__NAMES="$FILE__NAMES $name" 1.158 + FILE__NAMES="${FILE__NAMES# }" 1.159 + eval FILE_${name}_tmpname=$tmp 1.160 + eval FILE_${name}_name=$filename 1.161 + eval FILE_${name}_size=$(stat -c %s $tmp) 1.162 + eval FILE_${name}_type=$type 1.163 + elif [ -n "$name" ]; then 1.164 + eval cnt=\$POST_${name}_count 1.165 + cnt=$(($cnt + 1)) 1.166 + eval var=\$POST_${name}_$cnt 1.167 + while read line; do 1.168 + [ -n "$var" ] && var="$var 1.169 +" 1.170 + var="$var$line" 1.171 + done 1.172 + eval POST_${name}_$cnt="\$var" 1.173 + eval POST_${name}_count=$cnt 1.174 + case " $POST__NAMES " in 1.175 + *\ $name\ *) ;; 1.176 + *) POST__NAMES="$POST__NAMES $name" 1.177 + POST__NAMES="${POST__NAMES# }" ;; 1.178 + esac 1.179 + fi 1.180 + break ;; 1.181 + *) 1.182 + esac 1.183 + done < $i 1.184 + rm -f $i 1.185 + done 1.186 + rmdir $(dirname $post) ;; 1.187 + *) rm -rf $(dirname $post) 1.188 + read_query_string POST "$delim" ;; 1.189 + esac 1.190 +fi