summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Satiro <raysatiro@yahoo.com>2021-04-20 01:51:56 -0400
committerJay Satiro <raysatiro@yahoo.com>2021-04-20 01:51:56 -0400
commit711879ca7cbda86c391c2b4dfb4b39847f773dc5 (patch)
treeb8942fa6350c149c9dc846d30e26828840c0c3ea
parent6e3f2febcba4e744eb2f78db4905c76e73615c6c (diff)
downloadcurl-711879ca7cbda86c391c2b4dfb4b39847f773dc5.tar.gz
tool_operate: don't discard failed parallel transfer result
- Save a parallel transfer's result code only when it fails and the transfer is not being retried. Prior to this change the result code was always set which meant that a failed result could be erroneously discarded if a different transfer later had a successful result (CURLE_OK). Before: > curl --fail -Z https://httpbin.org/status/404 https://httpbin.org/delay/10 > echo %ERRORLEVEL% 0 After: > curl --fail -Z https://httpbin.org/status/404 https://httpbin.org/delay/10 > echo %ERRORLEVEL% 22 Closes #xxxx
-rw-r--r--src/tool_operate.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 942643290..86e28b4cd 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -2294,11 +2294,11 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
long delay;
struct per_transfer *ended;
CURL *easy = msg->easy_handle;
- result = msg->data.result;
+ CURLcode tres = msg->data.result;
curl_easy_getinfo(easy, CURLINFO_PRIVATE, (void *)&ended);
curl_multi_remove_handle(multi, easy);
- result = post_per_transfer(global, ended, result, &retry, &delay);
+ tres = post_per_transfer(global, ended, tres, &retry, &delay);
progress_finalize(ended); /* before it goes away */
all_added--; /* one fewer added */
checkmore = TRUE;
@@ -2307,8 +2307,11 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
/* we delay retries in full integer seconds only */
ended->startat = delay ? time(NULL) + delay/1000 : 0;
}
- else
+ else {
+ if(tres)
+ result = tres;
(void)del_per_transfer(ended);
+ }
}
} while(msg);
if(!checkmore) {
@@ -2320,9 +2323,11 @@ static CURLcode parallel_transfers(struct GlobalConfig *global,
}
if(checkmore) {
/* one or more transfers completed, add more! */
- (void)add_parallel_transfers(global, multi, share,
- &more_transfers,
- &added_transfers);
+ CURLcode tres = add_parallel_transfers(global, multi, share,
+ &more_transfers,
+ &added_transfers);
+ if(tres)
+ result = tres;
if(added_transfers)
/* we added new ones, make sure the loop doesn't exit yet */
still_running = 1;