slitaz-base-files diff rootfs/usr/lib/slitaz/httphelper.sh @ rev 258

libpkg.sh: unset TAGS too in unset_receipt(); and code reformatting
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Nov 27 16:26:29 2014 +0200 (2014-11-27)
parents c3e9d6b91059
children efac6599349a
line diff
     1.1 --- a/rootfs/usr/lib/slitaz/httphelper.sh	Thu Jun 26 18:25:46 2014 +0200
     1.2 +++ b/rootfs/usr/lib/slitaz/httphelper.sh	Thu Nov 27 16:26:29 2014 +0200
     1.3 @@ -19,22 +19,23 @@
     1.4  header() {
     1.5  	local i
     1.6  	[ -z "$1" ] && set -- "Content-type: text/html; charset=UTF-8"
     1.7 -	for i in "$@" ""
     1.8 -	do 
     1.9 +	for i in "$@" ""; do
    1.10  		echo -e "$i\r"
    1.11  	done
    1.12  }
    1.13  
    1.14  http_urlencode() {
    1.15 -	sed	-e "s|%|%25|g;s|!|%21|g;s|\*|%2A|g;s|'|%27|g;s|(|%28|g" \
    1.16 -		-e "s|)|%29|g;s|;|%3B|g;s|:|%3A|g;s|@|%40|g;s|&|%26|g" \
    1.17 -		-e "s|=|%3D|g;s|+|%2B|g;s|\$|%24|g;s|,|%2C|g;s|/|%2F|g" \
    1.18 -		-e "s|\?|%3F|g;s|#|%25|g;s|\[|%5B|g;s|\]|%5D|g;s| |+|g"
    1.19 +	sed \
    1.20 +		-e "s|%|%25|g;  s|!|%21|g; s|\*|%2A|g; s|'|%27|g;  s|(|%28|g" \
    1.21 +		-e "s|)|%29|g;  s|;|%3B|g; s|:|%3A|g;  s|@|%40|g;  s|&|%26|g" \
    1.22 +		-e "s|=|%3D|g;  s|+|%2B|g; s|\$|%24|g; s|,|%2C|g;  s|/|%2F|g" \
    1.23 +		-e "s|\?|%3F|g; s|#|%25|g; s|\[|%5B|g; s|\]|%5D|g; s| |+|g"
    1.24  }
    1.25  
    1.26  htmlentities() {
    1.27 -	echo $1 | sed -e 's|&|\&amp;|g;s|<|\&lt;|g;s|>|\&gt;|g' \
    1.28 -		-e 's|"|\&quot;|g;s|'"'"'|\&acute;|g;s|\t|\&#09;|g'
    1.29 +	echo $1 | sed \
    1.30 +		-e 's|&|\&amp;|g;  s|<|\&lt;|g;       s|>|\&gt;|g' \
    1.31 +		-e 's|"|\&quot;|g; s|'"'"'|\&apos;|g; s|\t|\&#09;|g'
    1.32  }
    1.33  
    1.34  # MD5 crypt a string such as password (httpd -m dont give same result ?)
    1.35 @@ -49,83 +50,98 @@
    1.36  
    1.37  _ARRAY()
    1.38  {
    1.39 -[ -z "$2" ] && eval echo \$${1}__NAMES ||
    1.40 -	[ -n "$(eval echo \$${1}__NAMES)" ] && eval echo \$${1}_${2}_${3:-1}
    1.41 +	if [ -z "$2" ]; then
    1.42 +		eval echo \$${1}__NAMES
    1.43 +	else
    1.44 +		[ -n "$(eval echo \$${1}__NAMES)" ] && eval echo \$${1}_${2}_${3:-1}
    1.45 +	fi
    1.46  }
    1.47  
    1.48 -GET()		{ _ARRAY GET	"$1" $2; }
    1.49 -POST()		{ _ARRAY POST	"$1" $2; }
    1.50 -FILE()		{ _ARRAY FILE	"$1" $2; }
    1.51 -COOKIE()	{ _ARRAY COOKIE	"$1" $2; }
    1.52 +GET()   	{ _ARRAY GET    "$1" $2; }
    1.53 +POST()  	{ _ARRAY POST   "$1" $2; }
    1.54 +FILE()  	{ _ARRAY FILE   "$1" $2; }
    1.55 +COOKIE()	{ _ARRAY COOKIE "$1" $2; }
    1.56  
    1.57  httpinfo()
    1.58  {
    1.59 -local i
    1.60 -local j
    1.61 -local x
    1.62 -env | sort | sed "s/=/='/;s/$/'/"
    1.63 -for x in GET POST COOKIE ; do
    1.64 -	for i in $($x) ; do
    1.65 -		if [ $($x $i count) -gt 1 ]; then
    1.66 -			for j in $(seq 1 $($x $i count)); do
    1.67 -				echo "$x($i,$j)='$($x $i $j)'"
    1.68 -			done
    1.69 -		else
    1.70 -			echo "$x($i)='$($x $i)'"
    1.71 -		fi
    1.72 +	local i
    1.73 +	local j
    1.74 +	local x
    1.75 +	env | sort | sed "s/=/='/;s/$/'/"
    1.76 +	for x in GET POST COOKIE ; do
    1.77 +		for i in $($x) ; do
    1.78 +			if [ $($x $i count) -gt 1 ]; then
    1.79 +				for j in $(seq 1 $($x $i count)); do
    1.80 +					echo "$x($i,$j)='$($x $i $j)'"
    1.81 +				done
    1.82 +			else
    1.83 +				echo "$x($i)='$($x $i)'"
    1.84 +			fi
    1.85 +		done
    1.86  	done
    1.87 -done
    1.88 -for i in $(FILE) ; do
    1.89 -	for j in name size type tmpname ; do
    1.90 -		echo "FILE($i,$j)='$(FILE $i $j)'"
    1.91 +	for i in $(FILE) ; do
    1.92 +		for j in name size type tmpname ; do
    1.93 +			echo "FILE($i,$j)='$(FILE $i $j)'"
    1.94 +		done
    1.95  	done
    1.96 -done
    1.97  }
    1.98  
    1.99  read_query_string()
   1.100  {
   1.101 -local i
   1.102 -local names
   1.103 -local cnt
   1.104 -names=""
   1.105 -IFS="&"
   1.106 -for i in $2 ; do
   1.107 -	var=${i%%[^A-Za-z_0-9]*}
   1.108 -	case " $names " in
   1.109 -	*\ $var\ *)	eval cnt=\$${1}_${var}_count ;;
   1.110 -	*)		cnt=0
   1.111 -			names="$names $var" ;;
   1.112 -	esac
   1.113 -	eval ${1}_${var}_count=$((++cnt))
   1.114 -	eval ${1}_${var}_$cnt=\'$(busybox httpd -d "${i#*=}" | sed "s/'/\'\\\\\'\'/g")\'
   1.115 -done
   1.116 -unset IFS
   1.117 -eval ${1}__NAMES=\'${names# }\'
   1.118 +	local i
   1.119 +	local names
   1.120 +	local cnt
   1.121 +	names=""
   1.122 +	IFS="&"
   1.123 +	for i in $2 ; do
   1.124 +		var=${i%%[^A-Za-z_0-9]*}
   1.125 +		case " $names " in
   1.126 +			*\ $var\ *)
   1.127 +				eval cnt=\$${1}_${var}_count ;;
   1.128 +			*)
   1.129 +				cnt=0
   1.130 +				names="$names $var" ;;
   1.131 +		esac
   1.132 +		eval ${1}_${var}_count=$((++cnt))
   1.133 +		eval ${1}_${var}_$cnt=\'$(busybox httpd -d "${i#*=}" | sed "s/'/\'\\\\\'\'/g")\'
   1.134 +	done
   1.135 +	unset IFS
   1.136 +	eval ${1}__NAMES=\'${names# }\'
   1.137  }
   1.138  
   1.139 +
   1.140 +
   1.141  [ -z "$GET__NAMES" ] && read_query_string GET "$QUERY_STRING"
   1.142  [ -z "$COOKIE_NAMES" ] &&
   1.143  	read_query_string COOKIE "$(echo "$HTTP_COOKIE" | sed 's/; /\&/g')"
   1.144  
   1.145 +
   1.146 +
   1.147  ddcut()
   1.148  {
   1.149 -page=4096
   1.150 -skip=$1
   1.151 -count=$(($2 - $1 -2))
   1.152 -tmp=$(($skip / $page))
   1.153 -[ $tmp -ne 0 ] && dd bs=$page skip=$tmp count=0 
   1.154 -skip=$(($skip - ($tmp * $page) ))
   1.155 -dd bs=1 skip=$skip count=0
   1.156 -tmp=$(( ($page - $skip) % $page ))
   1.157 -if [ $tmp -ne 0 -a $tmp -le $count ]; then
   1.158 -	dd bs=1 count=$tmp
   1.159 -	count=$(($count - $tmp))
   1.160 -fi
   1.161 -tmp=$(($count / $page))
   1.162 -[ $tmp -ne 0 ] && dd bs=$page count=$tmp
   1.163 -dd bs=1 count=$(($count - ($tmp * $page) ))
   1.164 +	page=4096
   1.165 +	skip=$1
   1.166 +	count=$(($2 - $1 -2))
   1.167 +
   1.168 +	tmp=$(($skip / $page))
   1.169 +	[ $tmp -ne 0 ] && dd bs=$page skip=$tmp count=0
   1.170 +
   1.171 +	skip=$(($skip - ($tmp * $page) ))
   1.172 +	dd bs=1 skip=$skip count=0
   1.173 +
   1.174 +	tmp=$(( ($page - $skip) % $page ))
   1.175 +	if [ $tmp -ne 0 -a $tmp -le $count ]; then
   1.176 +		dd bs=1 count=$tmp
   1.177 +		count=$(($count - $tmp))
   1.178 +	fi
   1.179 +
   1.180 +	tmp=$(($count / $page))
   1.181 +	[ $tmp -ne 0 ] && dd bs=$page count=$tmp
   1.182 +	dd bs=1 count=$(($count - ($tmp * $page) ))
   1.183  }
   1.184  
   1.185 +
   1.186 +
   1.187  if [ "$REQUEST_METHOD$POST__NAMES" == "POST" ]; then
   1.188  	prefix=/tmp/httpd_post
   1.189  	mkdir $prefix$$
   1.190 @@ -138,73 +154,79 @@
   1.191  	cat > ${post}0
   1.192  	read args < ${post}0
   1.193  	delim="${args%?}"
   1.194 +
   1.195  	case "$delim" in
   1.196 -	
   1.197 -	-*)	awk "/$delim/ { o+=index(\$0,\"$delim\")-1; print o }
   1.198 -	   		  { o+=1+length() }" < ${post}0 | while read offset; do
   1.199 -		    if [ $offset -ne 0 ]; then
   1.200 -			ddcut $last $offset < ${post}0 > $post$n 2> /dev/null
   1.201 -			n=$(($n+1))
   1.202 -		    fi
   1.203 -		    last=$offset
   1.204 +
   1.205 +	-*)
   1.206 +		awk "/$delim/ { o+=index(\$0,\"$delim\")-1; print o }
   1.207 +			{ o+=1+length() }" < ${post}0 | \
   1.208 +		while read offset; do
   1.209 +			if [ $offset -ne 0 ]; then
   1.210 +				ddcut $last $offset < ${post}0 > $post$n 2> /dev/null
   1.211 +				n=$(($n+1))
   1.212 +			fi
   1.213 +			last=$offset
   1.214  		done
   1.215  		rm -f ${post}0
   1.216 -		CR=`printf '\r'`
   1.217 +
   1.218  		for i in $post* ; do
   1.219 -		    head -n 2 $i | grep -q filename= || echo '' >> $i
   1.220 -		    filename=
   1.221 -		    while read line; do
   1.222 -			case "$line" in
   1.223 -			
   1.224 -			*Content-Disposition*)
   1.225 -			    name=$(echo $line | sed 's/.* name="\([^"]*\)".*$/\1/')
   1.226 -			    name=${name%%[^A-Za-z_0-9]*}
   1.227 -			    case "$line" in
   1.228 -			    *filename=*) filename=$(echo $line | sed 's/.* filename="\([^"]*\)".*$/\1/') ;;
   1.229 -			    esac ;;
   1.230 -			
   1.231 -			*Content-Type*)
   1.232 -			    type=$(echo $line | sed 's/.*-Type: \(.*\).$/\1/') ;;
   1.233 -			
   1.234 -			$CR)
   1.235 -			    if [ -n "$filename" ]; then
   1.236 -				tmp=$(mktemp $prefix$$/uploadXXXXXX)
   1.237 -				cat > $tmp
   1.238 -				FILE__NAMES="$FILE__NAMES $name"
   1.239 -				FILE__NAMES="${FILE__NAMES# }"
   1.240 -				eval FILE_${name}_tmpname=$tmp
   1.241 -				eval FILE_${name}_name=$filename
   1.242 -				eval FILE_${name}_size=$(stat -c %s $tmp)
   1.243 -				eval FILE_${name}_type=$type
   1.244 -			    elif [ -n "$name" ]; then
   1.245 -			        eval cnt=\$POST_${name}_count
   1.246 -			        cnt=$(($cnt + 1))
   1.247 -				eval var=\$POST_${name}_$cnt
   1.248 -				while read line; do
   1.249 -					[ -n "$var" ] && var="$var
   1.250 -"
   1.251 -					var="$var$line"
   1.252 -				done
   1.253 -				eval POST_${name}_$cnt="\$var"
   1.254 -				eval POST_${name}_count=$cnt
   1.255 -				case " $POST__NAMES " in
   1.256 -				*\ $name\ *) ;;
   1.257 -				*) POST__NAMES="$POST__NAMES $name"
   1.258 -				   POST__NAMES="${POST__NAMES# }" ;;
   1.259 +			head -n2 $i | grep -q filename= || echo '' >> $i
   1.260 +			filename=
   1.261 +			while read line; do
   1.262 +				case "$line" in
   1.263 +
   1.264 +					*Content-Disposition*)
   1.265 +						name=$(echo $line | sed 's/.* name="\([^"]*\)".*$/\1/')
   1.266 +						name=${name%%[^A-Za-z_0-9]*}
   1.267 +						case "$line" in
   1.268 +							*filename=*)
   1.269 +								filename=$(echo $line | sed 's/.* filename="\([^"]*\)".*$/\1/') ;;
   1.270 +						esac ;;
   1.271 +
   1.272 +					*Content-Type*)
   1.273 +						type=$(echo $line | sed 's/.*-Type: \(.*\).$/\1/') ;;
   1.274 +
   1.275 +					$'\r')
   1.276 +						if [ -n "$filename" ]; then
   1.277 +							tmp=$(mktemp $prefix$$/uploadXXXXXX)
   1.278 +							cat > $tmp
   1.279 +							FILE__NAMES="$FILE__NAMES $name"
   1.280 +							FILE__NAMES="${FILE__NAMES# }"
   1.281 +							eval FILE_${name}_tmpname=$tmp
   1.282 +							eval FILE_${name}_name=$filename
   1.283 +							eval FILE_${name}_size=$(stat -c %s $tmp)
   1.284 +							eval FILE_${name}_type=$type
   1.285 +						elif [ -n "$name" ]; then
   1.286 +							eval cnt=\$POST_${name}_count
   1.287 +							cnt=$(($cnt + 1))
   1.288 +							eval var=\$POST_${name}_$cnt
   1.289 +							while read line; do
   1.290 +								[ -n "$var" ] && var="$var"$'\n'
   1.291 +								var="$var$line"
   1.292 +							done
   1.293 +							eval POST_${name}_$cnt="\$var"
   1.294 +							eval POST_${name}_count=$cnt
   1.295 +							case " $POST__NAMES " in
   1.296 +								*\ $name\ *)
   1.297 +									;;
   1.298 +								*)
   1.299 +									POST__NAMES="$POST__NAMES $name"
   1.300 +									POST__NAMES="${POST__NAMES# }" ;;
   1.301 +							esac
   1.302 +						fi
   1.303 +						break ;;
   1.304 +
   1.305 +					*) ;;
   1.306  				esac
   1.307 -			    fi
   1.308 -			    break ;;
   1.309 -			*)
   1.310 -			esac
   1.311 -		    done < $i
   1.312 -		    rm -f $i
   1.313 +			done < $i
   1.314 +			rm -f $i
   1.315  		done
   1.316  		#rmdir $(dirname $post) 
   1.317  		;;
   1.318 -	
   1.319 -	*)	
   1.320 +
   1.321 +	*)
   1.322  		rm -rf $(dirname $post)
   1.323  		read_query_string POST "$args" ;;
   1.324 -	
   1.325 +
   1.326  	esac
   1.327  fi