]> git.lizzy.rs Git - plan9front.git/blob - rc/bin/hget
hget: do a HEAD request to check if the file is already complete (thanks miscief)
[plan9front.git] / rc / bin / hget
1 #!/bin/rc
2 rfork e
3 argv0=$0
4 fn usage {
5         echo usage: $argv0 '[ -l | -o file] [ -p body | -P ] [ -r header ] [ -m method ] [ -b baseurl ] url' >[1=2]
6         exit usage
7 }
8 s=0
9 o=()
10 p=()
11 P=()
12 r=()
13 m=()
14 b=()
15 l=()
16 while(~ $1 -*){
17         switch($1){
18         case -o
19                 o=$2
20                 shift
21         case -p
22                 p=$2
23                 shift
24         case -P
25                 P=1
26         case -r
27                 r=($r $2)
28                 shift
29         case -l
30                 l=1
31         case -m
32                 m=$2
33                 shift
34         case -b
35                 b=$2
36                 shift
37         case *
38                 usage
39         }
40         shift
41 }
42 if(! ~ $#* 1)
43         usage
44 if(! ~ $#o 0){
45         if(! ~ $#o 1)
46                 usage
47         if(test -s $o)
48                 s=`{ls -l $o | awk '{print $6}'}
49 }
50 <[3=0] <>/mnt/web/clone {
51         d=/mnt/web/^`{sed 1q}
52         if(~ $#b 1)
53                 echo -n baseurl $b >[1=0]
54         echo -n url $1 >[1=0]
55         if(! ~ $s 0 && ~ $#p 0 && ~ $#P 0 && ~ $#m 0){
56                 for(i in $r)
57                         echo -n headers $i >[1=0]
58                 echo -n request HEAD >[1=0]
59                 <$d/body {
60                         if(~ $s `{cat $d/contentlength >[2]/dev/null})       
61                                 exit ''
62                 }
63                 if(~ $#b 1)
64                         echo -n baseurl $b >[1=0]
65                 echo -n url $1 >[1=0]
66                 r=($r 'Range: bytes='^$s^'-')
67         }
68         for(i in $r)
69                 echo -n headers $i >[1=0]
70         if(~ $#m 1)
71                 echo -n request $m >[1=0]
72         if(! ~ $#p 0 || ! ~ $#P 0){
73                  >$d/postbody {
74                         if(! ~ $#p 0)
75                                 echo -n $"p
76                         if(! ~ $#P 0)
77                                 cat <[0=3]
78                 }
79         }
80         <$d/body {
81                 if(~ $#l 1){
82                         echo `{cat $d/parsed/url}
83                         exit
84                 }
85                 if(~ $#o 1){
86                         l=`{cat $d/contentlength >[2]/dev/null}
87                         x=`{awk 'BEGIN{FS=" |-"}/^bytes ([0-9]+)\-/{print $2}' \
88                                 $d/contentrange >[2]/dev/null}
89                         if(~ $s $l && ~ $#x 0)
90                                 exit
91                         if(~ $s $x)
92                                 exec cat >>$o
93                         exec cat >$o
94                 }
95                 c=`{cat $d/contentencoding >[2]/dev/null}
96                 switch($c){
97                 case *gzip*
98                         ~ `{cat $d/contenttype >[2]/dev/null} *gzip* || exec gunzip
99                 case *bzip2*
100                         ~ `{cat $d/contenttype >[2]/dev/null} *bzip2* || exec bunzip2
101                 case *compress*
102                         ~ `{cat $d/contenttype >[2]/dev/null} *compress* || exec uncompress
103                 }
104                 exec cat
105         }
106 }