Skip to content

Commit 3afdd0f

Browse files
authored
fix: tmp download file should be removed on cancel (#5849)
1 parent 43b7eb6 commit 3afdd0f

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

src-tauri/src/core/utils/download.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,16 @@ pub async fn download_files(
185185
.cancel_tokens
186186
.insert(task_id.to_string(), cancel_token.clone());
187187
}
188-
189-
let result =
190-
_download_files_internal(app.clone(), &items, &headers, task_id, cancel_token.clone())
191-
.await;
188+
// TODO: Support resuming downloads when FE is ready
189+
let result = _download_files_internal(
190+
app.clone(),
191+
&items,
192+
&headers,
193+
task_id,
194+
false,
195+
cancel_token.clone(),
196+
)
197+
.await;
192198

193199
// cleanup
194200
{
@@ -259,6 +265,7 @@ async fn _download_files_internal(
259265
items: &[DownloadItem],
260266
headers: &HashMap<String, String>,
261267
task_id: &str,
268+
resume: bool,
262269
cancel_token: CancellationToken,
263270
) -> Result<(), String> {
264271
log::info!("Start download task: {}", task_id);
@@ -318,7 +325,8 @@ async fn _download_files_internal(
318325
let tmp_save_path = save_path.with_extension(append_extension("tmp"));
319326
let url_save_path = save_path.with_extension(append_extension("url"));
320327

321-
let mut resume = tmp_save_path.exists()
328+
let mut should_resume = resume
329+
&& tmp_save_path.exists()
322330
&& tokio::fs::read_to_string(&url_save_path)
323331
.await
324332
.map(|url| url == item.url) // check if we resume the same URL
@@ -331,7 +339,7 @@ async fn _download_files_internal(
331339
log::info!("Started downloading: {}", item.url);
332340
let client = _get_client_for_item(item, &header_map).map_err(err_to_string)?;
333341
let mut download_delta = 0u64;
334-
let resp = if resume {
342+
let resp = if should_resume {
335343
let downloaded_size = tmp_save_path.metadata().map_err(err_to_string)?.len();
336344
match _get_maybe_resume(&client, &item.url, downloaded_size).await {
337345
Ok(resp) => {
@@ -346,7 +354,7 @@ async fn _download_files_internal(
346354
Err(e) => {
347355
// fallback to normal download
348356
log::warn!("Failed to resume download: {}", e);
349-
resume = false;
357+
should_resume = false;
350358
_get_maybe_resume(&client, &item.url, 0).await?
351359
}
352360
}
@@ -355,7 +363,7 @@ async fn _download_files_internal(
355363
};
356364
let mut stream = resp.bytes_stream();
357365

358-
let file = if resume {
366+
let file = if should_resume {
359367
// resume download, append to existing file
360368
tokio::fs::OpenOptions::new()
361369
.write(true)
@@ -372,6 +380,11 @@ async fn _download_files_internal(
372380
// write chunk to file
373381
while let Some(chunk) = stream.next().await {
374382
if cancel_token.is_cancelled() {
383+
if !should_resume {
384+
tokio::fs::remove_dir_all(&save_path.parent().unwrap())
385+
.await
386+
.ok();
387+
}
375388
log::info!("Download cancelled for task: {}", task_id);
376389
app.emit(&evt_name, evt.clone()).unwrap();
377390
return Ok(());

0 commit comments

Comments
 (0)