plan9fox/rc/bin/hget
cinap_lenrek a13ba7741f hget: do a HEAD request to check if the file is already complete (thanks miscief)
when we continue a download, make sure the file isnt already
complete, as otherwise the server might respond with a 416
as the range request will out of range.
2018-10-10 02:45:11 +02:00

106 lines
1.7 KiB
Bash
Executable file

#!/bin/rc
rfork e
argv0=$0
fn usage {
echo usage: $argv0 '[ -l | -o file] [ -p body | -P ] [ -r header ] [ -m method ] [ -b baseurl ] url' >[1=2]
exit usage
}
s=0
o=()
p=()
P=()
r=()
m=()
b=()
l=()
while(~ $1 -*){
switch($1){
case -o
o=$2
shift
case -p
p=$2
shift
case -P
P=1
case -r
r=($r $2)
shift
case -l
l=1
case -m
m=$2
shift
case -b
b=$2
shift
case *
usage
}
shift
}
if(! ~ $#* 1)
usage
if(! ~ $#o 0){
if(! ~ $#o 1)
usage
if(test -s $o)
s=`{ls -l $o | awk '{print $6}'}
}
<[3=0] <>/mnt/web/clone {
d=/mnt/web/^`{sed 1q}
if(~ $#b 1)
echo -n baseurl $b >[1=0]
echo -n url $1 >[1=0]
if(! ~ $s 0 && ~ $#p 0 && ~ $#P 0 && ~ $#m 0){
for(i in $r)
echo -n headers $i >[1=0]
echo -n request HEAD >[1=0]
<$d/body {
if(~ $s `{cat $d/contentlength >[2]/dev/null})
exit ''
}
if(~ $#b 1)
echo -n baseurl $b >[1=0]
echo -n url $1 >[1=0]
r=($r 'Range: bytes='^$s^'-')
}
for(i in $r)
echo -n headers $i >[1=0]
if(~ $#m 1)
echo -n request $m >[1=0]
if(! ~ $#p 0 || ! ~ $#P 0){
>$d/postbody {
if(! ~ $#p 0)
echo -n $"p
if(! ~ $#P 0)
cat <[0=3]
}
}
<$d/body {
if(~ $#l 1){
echo `{cat $d/parsed/url}
exit
}
if(~ $#o 1){
l=`{cat $d/contentlength >[2]/dev/null}
x=`{awk 'BEGIN{FS=" |-"}/^bytes ([0-9]+)\-/{print $2}' \
$d/contentrange >[2]/dev/null}
if(~ $s $l && ~ $#x 0)
exit
if(~ $s $x)
exec cat >>$o
exec cat >$o
}
c=`{cat $d/contentencoding >[2]/dev/null}
switch($c){
case *gzip*
~ `{cat $d/contenttype >[2]/dev/null} *gzip* || exec gunzip
case *bzip2*
~ `{cat $d/contenttype >[2]/dev/null} *bzip2* || exec bunzip2
case *compress*
~ `{cat $d/contenttype >[2]/dev/null} *compress* || exec uncompress
}
exec cat
}
}