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