xref: /illumos-gate/usr/src/contrib/ast/src/cmd/INIT/hurl.sh (revision b30d1939)
1*b30d1939SAndy Fiddaman########################################################################
2*b30d1939SAndy Fiddaman#                                                                      #
3*b30d1939SAndy Fiddaman#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1994-2011 AT&T Intellectual Property          #
5*b30d1939SAndy Fiddaman#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
7*b30d1939SAndy Fiddaman#                    by AT&T Intellectual Property                     #
8*b30d1939SAndy Fiddaman#                                                                      #
9*b30d1939SAndy Fiddaman#                A copy of the License is available at                 #
10*b30d1939SAndy Fiddaman#          http://www.eclipse.org/org/documents/epl-v10.html           #
11*b30d1939SAndy Fiddaman#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
12*b30d1939SAndy Fiddaman#                                                                      #
13*b30d1939SAndy Fiddaman#              Information and Software Systems Research               #
14*b30d1939SAndy Fiddaman#                            AT&T Research                             #
15*b30d1939SAndy Fiddaman#                           Florham Park NJ                            #
16*b30d1939SAndy Fiddaman#                                                                      #
17*b30d1939SAndy Fiddaman#                 Glenn Fowler <gsf@research.att.com>                  #
18*b30d1939SAndy Fiddaman#                                                                      #
19*b30d1939SAndy Fiddaman########################################################################
20*b30d1939SAndy Fiddaman: copy http url data
21*b30d1939SAndy Fiddaman
22*b30d1939SAndy Fiddamancommand=hurl
23*b30d1939SAndy Fiddamanagent="$command/2009-01-20 (AT&T Research)"
24*b30d1939SAndy Fiddamanauthorize=
25*b30d1939SAndy Fiddamanverbose=0
26*b30d1939SAndy Fiddaman
27*b30d1939SAndy Fiddamancase `(getopts '[-][123:xyz]' opt --xyz; echo 0$opt) 2>/dev/null` in
28*b30d1939SAndy Fiddaman0123)	ARGV0="-a $command"
29*b30d1939SAndy Fiddaman	USAGE=$'
30*b30d1939SAndy Fiddaman[-?
31*b30d1939SAndy Fiddaman@(#)$Id: hurl (AT&T Research) 2009-01-20 $
32*b30d1939SAndy Fiddaman]
33*b30d1939SAndy Fiddaman'$USAGE_LICENSE$'
34*b30d1939SAndy Fiddaman[+NAME?hurl - copy http url data]
35*b30d1939SAndy Fiddaman[+DESCRIPTION?\bhurl\b copies the data for the \bhttp\b \aurl\a operand
36*b30d1939SAndy Fiddaman	to the standard output. The \aurl\a must be of the form
37*b30d1939SAndy Fiddaman	\b[http://]]\b\ahost\a[\b:\b\aport\a]]\b/\b\apath\a. The default
38*b30d1939SAndy Fiddaman	\aport\a is \b80\b.]
39*b30d1939SAndy Fiddaman[+?\bhurl\b is a shell script that attempts to access the \aurl\a by
40*b30d1939SAndy Fiddaman	these methods:]{
41*b30d1939SAndy Fiddaman	[+/dev/tcp/\ahost\a\b/80\b?Supported by \bksh\b(1) and recent
42*b30d1939SAndy Fiddaman		\bbash\b(1).]
43*b30d1939SAndy Fiddaman	[+wget -nv -O - \aurl\a?]
44*b30d1939SAndy Fiddaman	[+lynx -source \aurl\a?]
45*b30d1939SAndy Fiddaman	[+curl -s -L -o - \aurl\a?]
46*b30d1939SAndy Fiddaman}
47*b30d1939SAndy Fiddaman[a:authorize?The url authorization user name and password, separated
48*b30d1939SAndy Fiddaman	by \b:\b (one colon character.)]:[user::password]
49*b30d1939SAndy Fiddaman[s:size?Terminate the data transmission after \abytes\a have been
50*b30d1939SAndy Fiddaman	transferred.]:[bytes]
51*b30d1939SAndy Fiddaman[v:verbose?Verbose trace.]
52*b30d1939SAndy Fiddaman
53*b30d1939SAndy Fiddamanurl
54*b30d1939SAndy Fiddaman
55*b30d1939SAndy Fiddaman[+SEE ALSO?\bcurl\b(1), \blynx\b(1), \bwget\b(1)]
56*b30d1939SAndy Fiddaman'
57*b30d1939SAndy Fiddaman	;;
58*b30d1939SAndy Fiddaman*)	ARGV0=""
59*b30d1939SAndy Fiddaman	USAGE="a:v"
60*b30d1939SAndy Fiddaman	;;
61*b30d1939SAndy Fiddamanesac
62*b30d1939SAndy Fiddaman
63*b30d1939SAndy Fiddamanusage()
64*b30d1939SAndy Fiddaman{
65*b30d1939SAndy Fiddaman	OPTIND=0
66*b30d1939SAndy Fiddaman	getopts $ARGV0 "$USAGE" OPT '-?'
67*b30d1939SAndy Fiddaman	exit 2
68*b30d1939SAndy Fiddaman}
69*b30d1939SAndy Fiddaman
70*b30d1939SAndy Fiddamaninteger limit=0 total=0 block=8*1024
71*b30d1939SAndy Fiddaman
72*b30d1939SAndy Fiddamanwhile	getopts $ARGV0 "$USAGE" OPT
73*b30d1939SAndy Fiddamando	case $OPT in
74*b30d1939SAndy Fiddaman	a)	authorize=$OPTARG ;;
75*b30d1939SAndy Fiddaman	s)	limit=$OPTARG ;;
76*b30d1939SAndy Fiddaman	v)	verbose=1 ;;
77*b30d1939SAndy Fiddaman	esac
78*b30d1939SAndy Fiddamandone
79*b30d1939SAndy Fiddamanshift `expr $OPTIND - 1`
80*b30d1939SAndy Fiddaman
81*b30d1939SAndy Fiddamanurl=$1
82*b30d1939SAndy FiddamanAUTHORIZE=
83*b30d1939SAndy Fiddaman
84*b30d1939SAndy Fiddamanexec 9<&0
85*b30d1939SAndy Fiddaman
86*b30d1939SAndy Fiddamanwhile	:
87*b30d1939SAndy Fiddamando	test 0 != $verbose && echo "$command: url=$url" >&2
88*b30d1939SAndy Fiddaman	case $url in
89*b30d1939SAndy Fiddaman	*://*/*)prot=${url%%:*}
90*b30d1939SAndy Fiddaman		url=${url#*://}
91*b30d1939SAndy Fiddaman		;;
92*b30d1939SAndy Fiddaman	*)	prot=http
93*b30d1939SAndy Fiddaman		;;
94*b30d1939SAndy Fiddaman	esac
95*b30d1939SAndy Fiddaman	host=$url
96*b30d1939SAndy Fiddaman	path=/${host#*/}
97*b30d1939SAndy Fiddaman	host=${host%%/*}
98*b30d1939SAndy Fiddaman	case $host in
99*b30d1939SAndy Fiddaman	*:+([0-9]))
100*b30d1939SAndy Fiddaman		port=${host##*:}
101*b30d1939SAndy Fiddaman		host=${host%:*}
102*b30d1939SAndy Fiddaman		;;
103*b30d1939SAndy Fiddaman	*)	port=80
104*b30d1939SAndy Fiddaman		;;
105*b30d1939SAndy Fiddaman	esac
106*b30d1939SAndy Fiddaman	test 0 != $verbose && echo "$command: prot=$prot host=$host port=$port path=$path" >&2
107*b30d1939SAndy Fiddaman	case $prot in
108*b30d1939SAndy Fiddaman	http)	if	(eval "exec >" || exit 0) 2>/dev/null &&
109*b30d1939SAndy Fiddaman			eval "exec 8<> /dev/tcp/\$host/$port" 2>/dev/null
110*b30d1939SAndy Fiddaman		then	test 0 != $verbose && echo "$command: using /dev/tcp/$host/$port" >&2
111*b30d1939SAndy Fiddaman			if	! echo "GET $path HTTP/1.0
112*b30d1939SAndy FiddamanHost: $host
113*b30d1939SAndy FiddamanUser-Agent: $agent
114*b30d1939SAndy Fiddaman${AUTHORIZE}
115*b30d1939SAndy Fiddaman
116*b30d1939SAndy Fiddaman" >&8
117*b30d1939SAndy Fiddaman			then	echo "$command: $host: write error"
118*b30d1939SAndy Fiddaman				exit 1
119*b30d1939SAndy Fiddaman			fi
120*b30d1939SAndy Fiddaman			{
121*b30d1939SAndy Fiddaman				if	! read prot code text
122*b30d1939SAndy Fiddaman				then	echo "$command: $host: read error" >&2
123*b30d1939SAndy Fiddaman					exit 1
124*b30d1939SAndy Fiddaman				fi
125*b30d1939SAndy Fiddaman				code=${code%:*}
126*b30d1939SAndy Fiddaman				type=Basic
127*b30d1939SAndy Fiddaman				realm=access
128*b30d1939SAndy Fiddaman				test 0 != $verbose && echo "$command: prot=$prot code=$code $text" >&2
129*b30d1939SAndy Fiddaman				while	:
130*b30d1939SAndy Fiddaman				do	if	! read head data
131*b30d1939SAndy Fiddaman					then	echo "$command: $host: read error" >&2
132*b30d1939SAndy Fiddaman						exit 1
133*b30d1939SAndy Fiddaman					fi
134*b30d1939SAndy Fiddaman					test 0 != $verbose && echo "$command: head=$head $data" >&2
135*b30d1939SAndy Fiddaman					case $head in
136*b30d1939SAndy Fiddaman					Location:)
137*b30d1939SAndy Fiddaman						case $code in
138*b30d1939SAndy Fiddaman						30[123])url=$data
139*b30d1939SAndy Fiddaman							continue 2
140*b30d1939SAndy Fiddaman							;;
141*b30d1939SAndy Fiddaman						esac
142*b30d1939SAndy Fiddaman						;;
143*b30d1939SAndy Fiddaman					WWW-Authenticate:)
144*b30d1939SAndy Fiddaman						set -- $data
145*b30d1939SAndy Fiddaman						type=$1
146*b30d1939SAndy Fiddaman						shift
147*b30d1939SAndy Fiddaman						eval "$@"
148*b30d1939SAndy Fiddaman						realm=${realm%$'\r'}
149*b30d1939SAndy Fiddaman						;;
150*b30d1939SAndy Fiddaman					''|?)	break
151*b30d1939SAndy Fiddaman						;;
152*b30d1939SAndy Fiddaman					esac
153*b30d1939SAndy Fiddaman				done
154*b30d1939SAndy Fiddaman				case $code in
155*b30d1939SAndy Fiddaman				200)	if	(( limit ))
156*b30d1939SAndy Fiddaman					then	(( limit = (limit + block - 1) / block))
157*b30d1939SAndy Fiddaman						dd bs=$block count=$limit silent=1
158*b30d1939SAndy Fiddaman					else	cat
159*b30d1939SAndy Fiddaman					fi
160*b30d1939SAndy Fiddaman					exit
161*b30d1939SAndy Fiddaman					;;
162*b30d1939SAndy Fiddaman				401)	{
163*b30d1939SAndy Fiddaman						if	[[ $AUTHORIZE || $type != Basic ]]
164*b30d1939SAndy Fiddaman						then	print authorization failed
165*b30d1939SAndy Fiddaman							exit 1
166*b30d1939SAndy Fiddaman						fi
167*b30d1939SAndy Fiddaman						if	[[ ! $authorize ]]
168*b30d1939SAndy Fiddaman						then	if	[[ ! -t 0 ]]
169*b30d1939SAndy Fiddaman							then	print authorization failed
170*b30d1939SAndy Fiddaman								exit 1
171*b30d1939SAndy Fiddaman							fi
172*b30d1939SAndy Fiddaman							print -n "Enter user name for $realm: "
173*b30d1939SAndy Fiddaman							read -u9 user
174*b30d1939SAndy Fiddaman							print -n "Password: "
175*b30d1939SAndy Fiddaman							trap 'stty echo <&9' 0 1 2 3 15
176*b30d1939SAndy Fiddaman							stty -echo
177*b30d1939SAndy Fiddaman							read password
178*b30d1939SAndy Fiddaman							stty echo
179*b30d1939SAndy Fiddaman							print
180*b30d1939SAndy Fiddaman							trap - 0 1 2 3 15
181*b30d1939SAndy Fiddaman							authorize=$user:$password
182*b30d1939SAndy Fiddaman						fi
183*b30d1939SAndy Fiddaman						AUTHORIZE=$'\nAuthorization: '$type' '$(print -n -r -- "$authorize" | uuencode -h -x base64)$'\r'
184*b30d1939SAndy Fiddaman					} <&9 >&2
185*b30d1939SAndy Fiddaman					continue 2
186*b30d1939SAndy Fiddaman					;;
187*b30d1939SAndy Fiddaman				*)	echo "$0: $url: $code: $text" >&2
188*b30d1939SAndy Fiddaman					exit 1
189*b30d1939SAndy Fiddaman					;;
190*b30d1939SAndy Fiddaman				esac
191*b30d1939SAndy Fiddaman			} <&8
192*b30d1939SAndy Fiddaman		elif	wget ${authorize:+--http-user="${authorize%:*}"} ${password:+--http-passwd="${password##*:}"} -nv -O - $url 2>/dev/null
193*b30d1939SAndy Fiddaman		then	test 0 != $verbose && echo "$command: using wget" >&2
194*b30d1939SAndy Fiddaman			exit
195*b30d1939SAndy Fiddaman		elif	lynx ${authorize:+-auth "$authorize"} -source $url 2>/dev/null
196*b30d1939SAndy Fiddaman		then	test 0 != $verbose && echo "$command: using wget" >&2
197*b30d1939SAndy Fiddaman			exit
198*b30d1939SAndy Fiddaman		elif	curl ${authorize:+-u "$authorize"} -s -L -o - $url 2>/dev/null
199*b30d1939SAndy Fiddaman		then	test 0 != $verbose && echo "$command: using curl" >&2
200*b30d1939SAndy Fiddaman			exit
201*b30d1939SAndy Fiddaman		else	echo "$command: $url: { /dev/tcp/$host/$port wget curl } failed" >&2
202*b30d1939SAndy Fiddaman			exit 1
203*b30d1939SAndy Fiddaman		fi
204*b30d1939SAndy Fiddaman		;;
205*b30d1939SAndy Fiddaman	*)	echo "$command: $prot: protocol not supported" >&2
206*b30d1939SAndy Fiddaman		exit 1
207*b30d1939SAndy Fiddaman		;;
208	esac
209done
210