@@ -17,42 +17,65 @@ import (
17
17
18
18
// Download handles direct binary releases
19
19
type Download struct {
20
- url string
20
+ urls [] string
21
21
}
22
22
23
23
// Fetch gets the package and returns location of downloaded file
24
24
func (d Download ) Fetch (ctx context.Context , dist , v string , mapper mapping.Mapper ) (string , error ) {
25
25
logger := zerolog .Ctx (ctx ).With ().Str ("func" , "GithubRelease.Get" ).Logger ()
26
26
27
- args := tpl .New (v , mapper )
28
-
29
- url , err := args .Render (d .url )
30
- if err != nil {
31
- return "" , err
32
- }
33
-
34
- logger .Debug ().Msgf ("fetching version %q for arch %q and OS %q at %s" , v , runtime .GOARCH , runtime .GOOS , url )
35
-
36
- req , err := http .NewRequest ("GET" , url , nil )
37
- if err != nil {
38
- return "" , err
39
- }
40
-
41
- resp , err := http .DefaultClient .Do (req )
42
- if err != nil {
43
- return "" , err
44
- }
45
- defer resp .Body .Close ()
46
-
47
- if resp .StatusCode != http .StatusOK {
48
- return "" , fmt .Errorf ("unable to download binary at %s: %s" , url , resp .Status )
27
+ var resp * http.Response
28
+
29
+ for i , u := range d .urls {
30
+
31
+ args := tpl .New (v , mapper )
32
+
33
+ url , err := args .Render (u )
34
+ if err != nil {
35
+ if len (d .urls )- 1 > i {
36
+ continue
37
+ } else {
38
+ return "" , err
39
+ }
40
+ }
41
+
42
+ logger .Debug ().Msgf ("fetching version %q for arch %q and OS %q at %s" , v , runtime .GOARCH , runtime .GOOS , url )
43
+
44
+ req , err := http .NewRequest ("GET" , url , nil )
45
+ if err != nil {
46
+ if len (d .urls )- 1 > i {
47
+ continue
48
+ } else {
49
+ return "" , err
50
+ }
51
+ }
52
+
53
+ resp , err = http .DefaultClient .Do (req )
54
+ if err != nil {
55
+ if len (d .urls )- 1 > i {
56
+ continue
57
+ } else {
58
+ return "" , err
59
+ }
60
+ }
61
+ defer resp .Body .Close ()
62
+
63
+ if resp .StatusCode != http .StatusOK {
64
+ if len (d .urls )- 1 > i {
65
+ logger .Debug ().Msgf ("unable to download binary at %s: %s, %d urls left to try..." , url , resp .Status , len (d .urls )- 1 - i )
66
+ continue
67
+ } else {
68
+ return "" , fmt .Errorf ("unable to download binary at %s: %s" , url , resp .Status )
69
+ }
70
+ }
71
+ // if we reach this point, download was successful, let's move on
72
+ break
49
73
}
50
74
51
75
tmpfile , err := ioutil .TempFile ("" , v )
52
76
if err != nil {
53
77
logger .Fatal ().Err (err )
54
78
}
55
-
56
79
defer tmpfile .Close ()
57
80
58
81
bar := progressbar .DefaultBytes (
0 commit comments