Skip to content
This repository was archived by the owner on Jul 4, 2025. It is now read-only.

Commit 6a7d288

Browse files
committed
handle error download
1 parent a41001f commit 6a7d288

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

engine/services/download_service.cc

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ size_t WriteCallback(char* ptr, size_t size, size_t nmemb, void* userdata) {
1717
return written;
1818
}
1919

20-
void ProcessCompletedTransfers(CURLM* multi_handle) {
20+
cpp::result<void, std::string> ProcessCompletedTransfers(CURLM* multi_handle) {
2121
CURLMsg* msg;
2222
int msgs_left;
2323
while ((msg = curl_multi_info_read(multi_handle, &msgs_left))) {
@@ -31,6 +31,9 @@ void ProcessCompletedTransfers(CURLM* multi_handle) {
3131
if (result != CURLE_OK) {
3232
CTL_ERR("Transfer failed for URL: " << url << " Error: "
3333
<< curl_easy_strerror(result));
34+
// download failed
35+
return cpp::fail("Transfer failed for URL: " + std::string(url) +
36+
" Error: " + curl_easy_strerror(result));
3437
} else {
3538
long response_code;
3639
curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &response_code);
@@ -39,10 +42,15 @@ void ProcessCompletedTransfers(CURLM* multi_handle) {
3942
} else {
4043
CTL_ERR("Transfer failed with HTTP code: " << response_code
4144
<< " for URL: " << url);
45+
// download failed
46+
return cpp::fail("Transfer failed with HTTP code: " +
47+
std::to_string(response_code) +
48+
" for URL: " + std::string(url));
4249
}
4350
}
4451
}
4552
}
53+
return {};
4654
}
4755
} // namespace
4856

@@ -334,7 +342,8 @@ void DownloadService::ProcessTask(DownloadTask& task, int worker_id) {
334342

335343
EmitTaskStarted(task);
336344

337-
ProcessMultiDownload(task, worker_data->multi_handle, task_handles);
345+
auto result =
346+
ProcessMultiDownload(task, worker_data->multi_handle, task_handles);
338347

339348
// clean up
340349
for (auto& [handle, file] : task_handles) {
@@ -343,28 +352,35 @@ void DownloadService::ProcessTask(DownloadTask& task, int worker_id) {
343352
fclose(file);
344353
}
345354

346-
ExecuteCallback(task);
347-
EmitTaskCompleted(task.id);
355+
if (!result.has_error()) {
356+
// if the download has error, we are not run the callback
357+
ExecuteCallback(task);
358+
EmitTaskCompleted(task.id);
359+
}
348360

349361
worker_data->downloading_data_map.clear();
350362
}
351363

352-
void DownloadService::ProcessMultiDownload(
364+
cpp::result<void, std::string> DownloadService::ProcessMultiDownload(
353365
DownloadTask& task, CURLM* multi_handle,
354366
const std::vector<std::pair<CURL*, FILE*>>& handles) {
355367
int still_running = 0;
356368
do {
357369
curl_multi_perform(multi_handle, &still_running);
358370
curl_multi_wait(multi_handle, nullptr, 0, MAX_WAIT_MSECS, nullptr);
359371

360-
ProcessCompletedTransfers(multi_handle);
372+
auto result = ProcessCompletedTransfers(multi_handle);
373+
if (result.has_error()) {
374+
EmitTaskError(task.id);
375+
return cpp::fail(result.error());
376+
}
361377

362378
if (task.status == DownloadTask::Status::Cancelled || stop_flag_) {
363379
EmitTaskStopped(task.id);
364-
return;
380+
return cpp::fail("Task " + task.id + " cancelled");
365381
}
366-
367382
} while (still_running);
383+
return {};
368384
}
369385

370386
void DownloadService::SetUpCurlHandle(CURL* handle, const DownloadItem& item,
@@ -432,6 +448,15 @@ void DownloadService::EmitTaskStopped(const std::string& task_id) {
432448
}
433449
}
434450

451+
void DownloadService::EmitTaskError(const std::string& task_id) {
452+
if (auto it = active_tasks_.find(task_id); it != active_tasks_.end()) {
453+
event_queue_->enqueue(
454+
EventType::DownloadEvent,
455+
DownloadEvent{.type_ = DownloadEventType::DownloadError,
456+
.download_task_ = *it->second});
457+
}
458+
}
459+
435460
void DownloadService::EmitTaskCompleted(const std::string& task_id) {
436461
std::lock_guard<std::mutex> lock(active_tasks_mutex_);
437462
if (auto it = active_tasks_.find(task_id); it != active_tasks_.end()) {

engine/services/download_service.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class DownloadService {
4848

4949
void ProcessTask(DownloadTask& task, int worker_id);
5050

51-
void ProcessMultiDownload(
51+
cpp::result<void, std::string> ProcessMultiDownload(
5252
DownloadTask& task, CURLM* multi_handle,
5353
const std::vector<std::pair<CURL*, FILE*>>& handles);
5454

@@ -61,6 +61,8 @@ class DownloadService {
6161

6262
void EmitTaskCompleted(const std::string& task_id);
6363

64+
void EmitTaskError(const std::string& task_id);
65+
6466
public:
6567
using OnDownloadTaskSuccessfully =
6668
std::function<void(const DownloadTask& task)>;

0 commit comments

Comments
 (0)