@@ -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
370386void 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+
435460void 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 ()) {
0 commit comments