diff --git a/crates/era-downloader/src/client.rs b/crates/era-downloader/src/client.rs index 03a4d97597..2fae9f96f8 100644 --- a/crates/era-downloader/src/client.rs +++ b/crates/era-downloader/src/client.rs @@ -67,16 +67,30 @@ impl EraClient { let number = self.file_name_to_number(file_name).ok_or_eyre("Cannot parse number from file name")?; - let mut stream = client.get(url).await?; - let mut file = File::create(&path).await?; - let mut hasher = Sha256::new(); - while let Some(item) = stream.next().await.transpose()? { - io::copy(&mut item.as_ref(), &mut file).await?; - hasher.update(item); + let mut tries = 1..3; + let mut actual_checksum: eyre::Result<_>; + loop { + actual_checksum = async { + let mut file = File::create(&path).await?; + let mut stream = client.get(url.clone()).await?; + let mut hasher = Sha256::new(); + + while let Some(item) = stream.next().await.transpose()? { + io::copy(&mut item.as_ref(), &mut file).await?; + hasher.update(item); + } + + Ok(hasher.finalize().to_vec()) + } + .await; + + if actual_checksum.is_ok() || tries.next().is_none() { + break; + } } - let actual_checksum = hasher.finalize().to_vec(); + let actual_checksum = actual_checksum?; let file = File::open(self.folder.join(Self::CHECKSUMS)).await?; let reader = io::BufReader::new(file);