Blame src/cmd/INIT/hurl.sh

Packit Service a8c26c
########################################################################
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
#               This software is part of the ast package               #
Packit Service a8c26c
#          Copyright (c) 1994-2011 AT&T Intellectual Property          #
Packit Service a8c26c
#                      and is licensed under the                       #
Packit Service a8c26c
#                 Eclipse Public License, Version 1.0                  #
Packit Service a8c26c
#                    by AT&T Intellectual Property                     #
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
#                A copy of the License is available at                 #
Packit Service a8c26c
#          http://www.eclipse.org/org/documents/epl-v10.html           #
Packit Service a8c26c
#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
#              Information and Software Systems Research               #
Packit Service a8c26c
#                            AT&T Research                             #
Packit Service a8c26c
#                           Florham Park NJ                            #
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
#                 Glenn Fowler <gsf@research.att.com>                  #
Packit Service a8c26c
#                                                                      #
Packit Service a8c26c
########################################################################
Packit Service a8c26c
: copy http url data
Packit Service a8c26c
Packit Service a8c26c
command=hurl
Packit Service a8c26c
agent="$command/2009-01-20 (AT&T Research)"
Packit Service a8c26c
authorize=
Packit Service a8c26c
verbose=0
Packit Service a8c26c
Packit Service a8c26c
case `(getopts '[-][123:xyz]' opt --xyz; echo 0$opt) 2>/dev/null` in
Packit Service a8c26c
0123)	ARGV0="-a $command"
Packit Service a8c26c
	USAGE=$'
Packit Service a8c26c
[-?
Packit Service a8c26c
@(#)$Id: hurl (AT&T Research) 2009-01-20 $
Packit Service a8c26c
]
Packit Service a8c26c
'$USAGE_LICENSE$'
Packit Service a8c26c
[+NAME?hurl - copy http url data]
Packit Service a8c26c
[+DESCRIPTION?\bhurl\b copies the data for the \bhttp\b \aurl\a operand
Packit Service a8c26c
	to the standard output. The \aurl\a must be of the form
Packit Service a8c26c
	\b[http://]]\b\ahost\a[\b:\b\aport\a]]\b/\b\apath\a. The default
Packit Service a8c26c
	\aport\a is \b80\b.]
Packit Service a8c26c
[+?\bhurl\b is a shell script that attempts to access the \aurl\a by
Packit Service a8c26c
	these methods:]{
Packit Service a8c26c
	[+/dev/tcp/\ahost\a\b/80\b?Supported by \bksh\b(1) and recent
Packit Service a8c26c
		\bbash\b(1).]
Packit Service a8c26c
	[+wget -nv -O - \aurl\a?]
Packit Service a8c26c
	[+lynx -source \aurl\a?]
Packit Service a8c26c
	[+curl -s -L -o - \aurl\a?]
Packit Service a8c26c
}
Packit Service a8c26c
[a:authorize?The url authorization user name and password, separated
Packit Service a8c26c
	by \b:\b (one colon character.)]:[user::password]
Packit Service a8c26c
[s:size?Terminate the data transmission after \abytes\a have been
Packit Service a8c26c
	transferred.]:[bytes]
Packit Service a8c26c
[v:verbose?Verbose trace.]
Packit Service a8c26c
Packit Service a8c26c
url
Packit Service a8c26c
Packit Service a8c26c
[+SEE ALSO?\bcurl\b(1), \blynx\b(1), \bwget\b(1)]
Packit Service a8c26c
'
Packit Service a8c26c
	;;
Packit Service a8c26c
*)	ARGV0=""
Packit Service a8c26c
	USAGE="a:v"
Packit Service a8c26c
	;;
Packit Service a8c26c
esac
Packit Service a8c26c
Packit Service a8c26c
usage()
Packit Service a8c26c
{
Packit Service a8c26c
	OPTIND=0
Packit Service a8c26c
	getopts $ARGV0 "$USAGE" OPT '-?'
Packit Service a8c26c
	exit 2
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
integer limit=0 total=0 block=8*1024
Packit Service a8c26c
Packit Service a8c26c
while	getopts $ARGV0 "$USAGE" OPT
Packit Service a8c26c
do	case $OPT in
Packit Service a8c26c
	a)	authorize=$OPTARG ;;
Packit Service a8c26c
	s)	limit=$OPTARG ;;
Packit Service a8c26c
	v)	verbose=1 ;;
Packit Service a8c26c
	esac
Packit Service a8c26c
done
Packit Service a8c26c
shift `expr $OPTIND - 1`
Packit Service a8c26c
Packit Service a8c26c
url=$1
Packit Service a8c26c
AUTHORIZE=
Packit Service a8c26c
Packit Service a8c26c
exec 9<&0
Packit Service a8c26c
Packit Service a8c26c
while	:
Packit Service a8c26c
do	test 0 != $verbose && echo "$command: url=$url" >&2
Packit Service a8c26c
	case $url in
Packit Service a8c26c
	*://*/*)prot=${url%%:*}
Packit Service a8c26c
		url=${url#*://}
Packit Service a8c26c
		;;
Packit Service a8c26c
	*)	prot=http
Packit Service a8c26c
		;;
Packit Service a8c26c
	esac
Packit Service a8c26c
	host=$url
Packit Service a8c26c
	path=/${host#*/}
Packit Service a8c26c
	host=${host%%/*}
Packit Service a8c26c
	case $host in
Packit Service a8c26c
	*:+([0-9]))
Packit Service a8c26c
		port=${host##*:}
Packit Service a8c26c
		host=${host%:*}
Packit Service a8c26c
		;;
Packit Service a8c26c
	*)	port=80
Packit Service a8c26c
		;;
Packit Service a8c26c
	esac
Packit Service a8c26c
	test 0 != $verbose && echo "$command: prot=$prot host=$host port=$port path=$path" >&2
Packit Service a8c26c
	case $prot in
Packit Service a8c26c
	http)	if	(eval "exec >" || exit 0) 2>/dev/null &&
Packit Service a8c26c
			eval "exec 8<> /dev/tcp/\$host/$port" 2>/dev/null
Packit Service a8c26c
		then	test 0 != $verbose && echo "$command: using /dev/tcp/$host/$port" >&2
Packit Service a8c26c
			if	! echo "GET $path HTTP/1.0
Packit Service a8c26c
Host: $host
Packit Service a8c26c
User-Agent: $agent
${AUTHORIZE}
Packit Service a8c26c

" >&8
Packit Service a8c26c
			then	echo "$command: $host: write error"
Packit Service a8c26c
				exit 1
Packit Service a8c26c
			fi
Packit Service a8c26c
			{
Packit Service a8c26c
				if	! read prot code text
Packit Service a8c26c
				then	echo "$command: $host: read error" >&2
Packit Service a8c26c
					exit 1
Packit Service a8c26c
				fi
Packit Service a8c26c
				code=${code%:*}
Packit Service a8c26c
				type=Basic
Packit Service a8c26c
				realm=access
Packit Service a8c26c
				test 0 != $verbose && echo "$command: prot=$prot code=$code $text" >&2
Packit Service a8c26c
				while	:
Packit Service a8c26c
				do	if	! read head data
Packit Service a8c26c
					then	echo "$command: $host: read error" >&2
Packit Service a8c26c
						exit 1
Packit Service a8c26c
					fi
Packit Service a8c26c
					test 0 != $verbose && echo "$command: head=$head $data" >&2
Packit Service a8c26c
					case $head in
Packit Service a8c26c
					Location:)
Packit Service a8c26c
						case $code in
Packit Service a8c26c
						30[123])url=$data
Packit Service a8c26c
							continue 2
Packit Service a8c26c
							;;
Packit Service a8c26c
						esac
Packit Service a8c26c
						;;
Packit Service a8c26c
					WWW-Authenticate:)
Packit Service a8c26c
						set -- $data
Packit Service a8c26c
						type=$1
Packit Service a8c26c
						shift
Packit Service a8c26c
						eval "$@"
Packit Service a8c26c
						realm=${realm%$'\r'}
Packit Service a8c26c
						;;
Packit Service a8c26c
					''|?)	break
Packit Service a8c26c
						;;
Packit Service a8c26c
					esac
Packit Service a8c26c
				done
Packit Service a8c26c
				case $code in
Packit Service a8c26c
				200)	if	(( limit ))
Packit Service a8c26c
					then	(( limit = (limit + block - 1) / block))
Packit Service a8c26c
						dd bs=$block count=$limit silent=1
Packit Service a8c26c
					else	cat
Packit Service a8c26c
					fi
Packit Service a8c26c
					exit
Packit Service a8c26c
					;;
Packit Service a8c26c
				401)	{
Packit Service a8c26c
						if	[[ $AUTHORIZE || $type != Basic ]]
Packit Service a8c26c
						then	print authorization failed
Packit Service a8c26c
							exit 1
Packit Service a8c26c
						fi
Packit Service a8c26c
						if	[[ ! $authorize ]]
Packit Service a8c26c
						then	if	[[ ! -t 0 ]]
Packit Service a8c26c
							then	print authorization failed
Packit Service a8c26c
								exit 1
Packit Service a8c26c
							fi
Packit Service a8c26c
							print -n "Enter user name for $realm: "
Packit Service a8c26c
							read -u9 user
Packit Service a8c26c
							print -n "Password: "
Packit Service a8c26c
							trap 'stty echo <&9' 0 1 2 3 15
Packit Service a8c26c
							stty -echo
Packit Service a8c26c
							read password
Packit Service a8c26c
							stty echo
Packit Service a8c26c
							print
Packit Service a8c26c
							trap - 0 1 2 3 15
Packit Service a8c26c
							authorize=$user:$password
Packit Service a8c26c
						fi
Packit Service a8c26c
						AUTHORIZE=$'\nAuthorization: '$type' '$(print -n -r -- "$authorize" | uuencode -h -x base64)$'\r'
Packit Service a8c26c
					} <&9 >&2
Packit Service a8c26c
					continue 2
Packit Service a8c26c
					;;
Packit Service a8c26c
				*)	echo "$0: $url: $code: $text" >&2
Packit Service a8c26c
					exit 1
Packit Service a8c26c
					;;
Packit Service a8c26c
				esac
Packit Service a8c26c
			} <&8 
Packit Service a8c26c
		elif	wget ${authorize:+--http-user="${authorize%:*}"} ${password:+--http-passwd="${password##*:}"} -nv -O - $url 2>/dev/null
Packit Service a8c26c
		then	test 0 != $verbose && echo "$command: using wget" >&2
Packit Service a8c26c
			exit
Packit Service a8c26c
		elif	lynx ${authorize:+-auth "$authorize"} -source $url 2>/dev/null
Packit Service a8c26c
		then	test 0 != $verbose && echo "$command: using wget" >&2
Packit Service a8c26c
			exit
Packit Service a8c26c
		elif	curl ${authorize:+-u "$authorize"} -s -L -o - $url 2>/dev/null
Packit Service a8c26c
		then	test 0 != $verbose && echo "$command: using curl" >&2
Packit Service a8c26c
			exit
Packit Service a8c26c
		else	echo "$command: $url: { /dev/tcp/$host/$port wget curl } failed" >&2
Packit Service a8c26c
			exit 1
Packit Service a8c26c
		fi
Packit Service a8c26c
		;;
Packit Service a8c26c
	*)	echo "$command: $prot: protocol not supported" >&2
Packit Service a8c26c
		exit 1
Packit Service a8c26c
		;;
Packit Service a8c26c
	esac
Packit Service a8c26c
done