diff options
author | Jay Satiro <raysatiro@yahoo.com> | 2021-04-20 01:51:56 -0400 |
---|---|---|
committer | Jay Satiro <raysatiro@yahoo.com> | 2021-04-20 01:51:56 -0400 |
commit | 711879ca7cbda86c391c2b4dfb4b39847f773dc5 (patch) | |
tree | b8942fa6350c149c9dc846d30e26828840c0c3ea /src | |
parent | 6e3f2febcba4e744eb2f78db4905c76e73615c6c (diff) | |
download | curl-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
Diffstat (limited to 'src')
-rw-r--r-- | src/tool_operate.c | 17 |
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; |