wok-tiny annotate busybox/stuff/httpd_helper.sh @ rev 142

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