@@ -271,7 +271,10 @@ public function downloadPythonBinary(
271
271
}
272
272
$ file_name = $ filename . '.gz ' ;
273
273
$ save_file_loc = $ dir . $ file_name ;
274
- if (!file_exists ($ dir . $ filename ) || $ update ) {
274
+ $ shouldDownloadBinary = $ this ->compareBinaryHash (
275
+ $ url , $ dir . $ filename , $ binariesFolder , $ filename
276
+ );
277
+ if (!file_exists ($ dir . $ filename ) || ($ update && $ shouldDownloadBinary )) {
275
278
$ cURL = curl_init ($ url );
276
279
$ fp = fopen ($ save_file_loc , 'wb ' );
277
280
if ($ fp ) {
@@ -305,6 +308,88 @@ public function downloadPythonBinary(
305
308
}
306
309
}
307
310
311
+ /**
312
+ * @param string $binaryPath
313
+ * @param array $binariesFolder,
314
+ * @param string $filanem
315
+ *
316
+ * @return bool
317
+ */
318
+ public function compareBinaryHash (
319
+ string $ url ,
320
+ string $ binaryPath ,
321
+ array $ binariesFolder ,
322
+ string $ filename
323
+ ) {
324
+ if (file_exists ($ binaryPath )) {
325
+ // get current binary hash (from .sha256 file or directly from existing binary)
326
+ if (file_exists ($ binaryPath . '.sha256 ' )) {
327
+ $ currentBinaryHash = file_get_contents (
328
+ $ binaryPath . '.sha256 ' , false , null , 0 , 64
329
+ );
330
+ } else {
331
+ $ binaryData = file_get_contents ($ binaryPath );
332
+ $ currentBinaryHash = hash ('sha256 ' , $ binaryData );
333
+ }
334
+ // download new binary sha256 hash from attached file to release
335
+ copy ($ binaryPath . '.sha256 ' , $ binaryPath . '.sha256.old ' );
336
+ $ newBinaryHash = $ this ->downloadBinaryHash (
337
+ str_replace ('.gz ' , '.sha256 ' , $ url ), $ binariesFolder , $ filename
338
+ );
339
+ // should update binary if hashes not equial
340
+ if ($ newBinaryHash ['success ' ]) {
341
+ return $ currentBinaryHash != $ newBinaryHash ['binaryHash ' ];
342
+ } else {
343
+ // revert back old hash file
344
+ copy ($ binaryPath . '.sha256.old ' , $ binaryPath . '.sha256 ' );
345
+ unlink ($ binaryPath . '.sha256.old ' );
346
+ }
347
+ }
348
+ return false ;
349
+ }
350
+
351
+ /**
352
+ * Perform cURL download binary's sha256 sum file
353
+ *
354
+ * @param string $url url to the binary hashsum file
355
+ * @param array $binariesFolder appdata binaries folder
356
+ * @param string $filename downloaded checksum filename
357
+ *
358
+ * @return array
359
+ */
360
+ public function downloadBinaryHash (
361
+ string $ url ,
362
+ array $ binariesFolder ,
363
+ string $ filename
364
+ ): array {
365
+ if (isset ($ binariesFolder ['success ' ]) && $ binariesFolder ['success ' ]) {
366
+ $ dir = $ binariesFolder ['path ' ] . '/ ' ;
367
+ } else {
368
+ return $ binariesFolder ; // Return getAppDataFolder result
369
+ }
370
+ $ file_name = $ filename . '.sha256 ' ;
371
+ $ save_file_loc = $ dir . $ file_name ;
372
+ $ cURL = curl_init ($ url );
373
+ $ fp = fopen ($ save_file_loc , 'w ' );
374
+ if ($ fp ) {
375
+ curl_setopt_array ($ cURL , [
376
+ CURLOPT_RETURNTRANSFER => true ,
377
+ CURLOPT_FILE => $ fp ,
378
+ CURLOPT_FOLLOWLOCATION => true ,
379
+ CURLOPT_RANGE => 64 ,
380
+ ]);
381
+ $ binaryHash = curl_exec ($ cURL );
382
+ curl_close ($ cURL );
383
+ fclose ($ fp );
384
+ return [
385
+ 'success ' => true ,
386
+ 'binaryHash ' => $ binaryHash ,
387
+ 'binaryHashFilePath ' => $ save_file_loc ,
388
+ ];
389
+ }
390
+ return ['success ' => false ];
391
+ }
392
+
308
393
/**
309
394
* Ungzip target file
310
395
*
0 commit comments