mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
212 lines
5.9 KiB
Bash
212 lines
5.9 KiB
Bash
########################################################################
|
|
# #
|
|
# This software is part of the ast package #
|
|
# Copyright (c) 1994-2011 AT&T Intellectual Property #
|
|
# Copyright (c) 2020-2021 Contributors to ksh 93u+m #
|
|
# and is licensed under the #
|
|
# Eclipse Public License, Version 1.0 #
|
|
# by AT&T Intellectual Property #
|
|
# #
|
|
# A copy of the License is available at #
|
|
# http://www.eclipse.org/org/documents/epl-v10.html #
|
|
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
|
|
# #
|
|
# Information and Software Systems Research #
|
|
# AT&T Research #
|
|
# Florham Park NJ #
|
|
# #
|
|
# Glenn Fowler <gsf@research.att.com> #
|
|
# #
|
|
########################################################################
|
|
: copy http url data
|
|
|
|
(command set -o posix) 2>/dev/null && set -o posix
|
|
|
|
command=hurl
|
|
agent="$command/2009-01-20 (AT&T Research)"
|
|
authorize=
|
|
verbose=0
|
|
|
|
case `(getopts '[-][123:xyz]' opt --xyz; echo 0$opt) 2>/dev/null` in
|
|
0123) ARGV0="-a $command"
|
|
USAGE=$'
|
|
[-?
|
|
@(#)$Id: hurl (AT&T Research) 2009-01-20 $
|
|
]
|
|
[-author?Glenn Fowler <gsf@research.att.com>]
|
|
[-copyright?Copyright (c) 2003-2012 AT&T Intellectual Property]
|
|
[-license?http://www.eclipse.org/org/documents/epl-v10.html]
|
|
[+NAME?hurl - copy http url data]
|
|
[+DESCRIPTION?\bhurl\b copies the data for the \bhttp\b \aurl\a operand
|
|
to the standard output. The \aurl\a must be of the form
|
|
\b[http://]]\b\ahost\a[\b:\b\aport\a]]\b/\b\apath\a. The default
|
|
\aport\a is \b80\b.]
|
|
[+?\bhurl\b is a shell script that attempts to access the \aurl\a by
|
|
these methods:]{
|
|
[+/dev/tcp/\ahost\a\b/80\b?Supported by \bksh\b(1) and recent
|
|
\bbash\b(1).]
|
|
[+wget -nv -O - \aurl\a?]
|
|
[+lynx -source \aurl\a?]
|
|
[+curl -s -L -o - \aurl\a?]
|
|
}
|
|
[a:authorize?The url authorization user name and password, separated
|
|
by \b:\b (one colon character).]:[user::password]
|
|
[s:size?Terminate the data transmission after \abytes\a have been
|
|
transferred.]:[bytes]
|
|
[v:verbose?Verbose trace.]
|
|
|
|
url
|
|
|
|
[+SEE ALSO?\bcurl\b(1), \blynx\b(1), \bwget\b(1)]
|
|
'
|
|
;;
|
|
*) ARGV0=""
|
|
USAGE="a:v"
|
|
;;
|
|
esac
|
|
|
|
usage()
|
|
{
|
|
OPTIND=0
|
|
getopts $ARGV0 "$USAGE" OPT '-?'
|
|
exit 2
|
|
}
|
|
|
|
integer limit=0 total=0 block=8*1024
|
|
|
|
while getopts $ARGV0 "$USAGE" OPT
|
|
do case $OPT in
|
|
a) authorize=$OPTARG ;;
|
|
s) limit=$OPTARG ;;
|
|
v) verbose=1 ;;
|
|
esac
|
|
done
|
|
shift `expr $OPTIND - 1`
|
|
|
|
url=$1
|
|
AUTHORIZE=
|
|
|
|
exec 9<&0
|
|
|
|
while :
|
|
do test 0 != $verbose && echo "$command: url=$url" >&2
|
|
case $url in
|
|
*://*/*)prot=${url%%:*}
|
|
url=${url#*://}
|
|
;;
|
|
*) prot=http
|
|
;;
|
|
esac
|
|
host=$url
|
|
path=/${host#*/}
|
|
host=${host%%/*}
|
|
case $host in
|
|
*:+([0-9]))
|
|
port=${host##*:}
|
|
host=${host%:*}
|
|
;;
|
|
*) port=80
|
|
;;
|
|
esac
|
|
test 0 != $verbose && echo "$command: prot=$prot host=$host port=$port path=$path" >&2
|
|
case $prot in
|
|
http) if (eval "exec >" || exit 0) 2>/dev/null &&
|
|
eval "exec 8<> /dev/tcp/\$host/$port" 2>/dev/null
|
|
then test 0 != $verbose && echo "$command: using /dev/tcp/$host/$port" >&2
|
|
if ! echo "GET $path HTTP/1.0
|
|
Host: $host
|
|
User-Agent: $agent
|
|
${AUTHORIZE}
|
|
|
|
" >&8
|
|
then echo "$command: $host: write error"
|
|
exit 1
|
|
fi
|
|
{
|
|
if ! read prot code text
|
|
then echo "$command: $host: read error" >&2
|
|
exit 1
|
|
fi
|
|
code=${code%:*}
|
|
type=Basic
|
|
realm=access
|
|
test 0 != $verbose && echo "$command: prot=$prot code=$code $text" >&2
|
|
while :
|
|
do if ! read head data
|
|
then echo "$command: $host: read error" >&2
|
|
exit 1
|
|
fi
|
|
test 0 != $verbose && echo "$command: head=$head $data" >&2
|
|
case $head in
|
|
Location:)
|
|
case $code in
|
|
30[123])url=$data
|
|
continue 2
|
|
;;
|
|
esac
|
|
;;
|
|
WWW-Authenticate:)
|
|
set -- $data
|
|
type=$1
|
|
shift
|
|
eval "$@"
|
|
realm=${realm%$'\r'}
|
|
;;
|
|
''|?) break
|
|
;;
|
|
esac
|
|
done
|
|
case $code in
|
|
200) if (( limit ))
|
|
then (( limit = (limit + block - 1) / block))
|
|
dd bs=$block count=$limit silent=1
|
|
else cat
|
|
fi
|
|
exit
|
|
;;
|
|
401) {
|
|
if [[ $AUTHORIZE || $type != Basic ]]
|
|
then print authorization failed
|
|
exit 1
|
|
fi
|
|
if [[ ! $authorize ]]
|
|
then if [[ ! -t 0 ]]
|
|
then print authorization failed
|
|
exit 1
|
|
fi
|
|
print -n "Enter user name for $realm: "
|
|
read -u9 user
|
|
print -n "Password: "
|
|
trap 'stty echo <&9' 0 1 2 3 15
|
|
stty -echo
|
|
read password
|
|
stty echo
|
|
print
|
|
trap - 0 1 2 3 15
|
|
authorize=$user:$password
|
|
fi
|
|
AUTHORIZE=$'\nAuthorization: '$type' '$(print -n -r -- "$authorize" | uuencode -h -x base64)$'\r'
|
|
} <&9 >&2
|
|
continue 2
|
|
;;
|
|
*) echo "$0: $url: $code: $text" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
} <&8
|
|
elif wget ${authorize:+--http-user="${authorize%:*}"} ${password:+--http-passwd="${password##*:}"} -nv -O - $url 2>/dev/null
|
|
then test 0 != $verbose && echo "$command: using wget" >&2
|
|
exit
|
|
elif lynx ${authorize:+-auth "$authorize"} -source $url 2>/dev/null
|
|
then test 0 != $verbose && echo "$command: using wget" >&2
|
|
exit
|
|
elif curl ${authorize:+-u "$authorize"} -s -L -o - $url 2>/dev/null
|
|
then test 0 != $verbose && echo "$command: using curl" >&2
|
|
exit
|
|
else echo "$command: $url: { /dev/tcp/$host/$port wget curl } failed" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
*) echo "$command: $prot: protocol not supported" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|