@@ -110,27 +110,45 @@ def run(self):
110110 self .session .close ()
111111 self .shared_memory .close ()
112112
113- def v2 (self , task : DownloadTask2 ):
114- retries = 5
115- urls = self .secure_links [task .product_id ]
116-
117- compressed_md5 = task .compressed_sum
118-
119- endpoint = copy (urls [0 ])
113+ def _get_download_url_v2 (self , task , urls , index ):
114+ if len (urls ) <= index :
115+ index = len (urls ) - 1
116+ endpoint = copy (urls [index ])
120117 if task .product_id != 'redist' :
121- endpoint ["parameters" ]["path" ] += f"/{ dl_utils .galaxy_path (compressed_md5 )} "
118+ endpoint ["parameters" ]["path" ] += f"/{ dl_utils .galaxy_path (task . compressed_sum )} "
122119 url = dl_utils .merge_url_with_params (
123120 endpoint ["url_format" ], endpoint ["parameters" ]
124121 )
125122 else :
126- endpoint ["url" ] += "/" + dl_utils .galaxy_path (compressed_md5 )
123+ endpoint ["url" ] += "/" + dl_utils .galaxy_path (task . compressed_sum )
127124 url = endpoint ["url" ]
125+ return url
126+
127+ def _get_download_url_v1 (self , urls ):
128+ if type (urls ) == str :
129+ url = urls
130+ else :
131+ endpoint = copy (urls [0 ])
132+ endpoint ["parameters" ]["path" ] += "/main.bin"
133+ url = dl_utils .merge_url_with_params (
134+ endpoint ["url_format" ], endpoint ["parameters" ]
135+ )
136+ return url
137+
138+ def v2 (self , task : DownloadTask2 ):
139+ retries = 5
140+ urls = self .secure_links [task .product_id ]
141+
142+ compressed_md5 = task .compressed_sum
143+ preferred_endpoint = 0
144+ url = self ._get_download_url_v2 (task , urls , preferred_endpoint )
128145
129146 buffer = bytes ()
130147 compressed_sum = hashlib .md5 ()
131148 download_size = 0
132149 response = None
133150 while retries > 0 :
151+ response = None
134152 buffer = bytes ()
135153 compressed_sum = hashlib .md5 ()
136154 download_size = 0
@@ -147,10 +165,13 @@ def v2(self, task: DownloadTask2):
147165
148166 except Exception as e :
149167 print ("Connection failed" , e )
150- if response and response .status_code == 401 :
168+ if response and response .status_code in [ 401 , 403 ] :
151169 self .results_queue .put (DownloadTaskResult (False , FailReason .UNAUTHORIZED , task ))
152170 print ("Connection failed, unauthorized" )
153171 return
172+ elif response and response .status_code > 403 :
173+ preferred_endpoint += 1
174+ url = self ._get_download_url_v2 (task , urls , preferred_endpoint )
154175 retries -= 1
155176 time .sleep (2 )
156177 continue
@@ -180,18 +201,12 @@ def v1(self, task: DownloadTask1):
180201 urls = self .secure_links [task .product_id ]
181202
182203 response = None
183- if type (urls ) == str :
184- url = urls
185- else :
186- endpoint = copy (urls [0 ])
187- endpoint ["parameters" ]["path" ] += "/main.bin"
188- url = dl_utils .merge_url_with_params (
189- endpoint ["url_format" ], endpoint ["parameters" ]
190- )
204+ url = self ._get_download_url_v1 (urls )
191205 range_header = dl_utils .get_range_header (task .offset , task .size )
192206
193207 buffer = bytes ()
194208 while retries > 0 :
209+ response = None
195210 buffer = bytes ()
196211 try :
197212 response = self .session .get (url , stream = True , timeout = 10 , headers = {'Range' : range_header })
0 commit comments