|
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
|