XFERINFOFUNCTION: support CURL_PROGRESSFUNC_CONTINUE

(also for PROGRESSFUNCTION)

By returning this value from the callback, the internal progress
function call is still called afterward.

Closes #4599
This commit is contained in:
John Schroeder 2019-11-26 09:13:11 +01:00 committed by Daniel Stenberg
parent 9b879160df
commit 7cf18b05e0
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
5 changed files with 27 additions and 11 deletions

View File

@ -60,8 +60,11 @@ Unknown/unused argument values passed to the callback will be set to zero
the callback will be called one or more times first, before it knows the data the callback will be called one or more times first, before it knows the data
sizes so a program must be made to handle that. sizes so a program must be made to handle that.
Returning a non-zero value from this callback will cause libcurl to abort the If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP. libcurl to continue executing the default progress function.
Returning any other non-zero value from this callback will cause libcurl to
abort the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
If you transfer data with the multi interface, this function will not be If you transfer data with the multi interface, this function will not be
called during periods of idleness unless you call the appropriate libcurl called during periods of idleness unless you call the appropriate libcurl

View File

@ -57,8 +57,11 @@ Unknown/unused argument values passed to the callback will be set to zero
the callback will be called one or more times first, before it knows the data the callback will be called one or more times first, before it knows the data
sizes so a program must be made to handle that. sizes so a program must be made to handle that.
Returning a non-zero value from this callback will cause libcurl to abort the If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP. libcurl to continue executing the default progress function.
Returning any other non-zero value from this callback will cause libcurl to
abort the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
If you transfer data with the multi interface, this function will not be If you transfer data with the multi interface, this function will not be
called during periods of idleness unless you call the appropriate libcurl called during periods of idleness unless you call the appropriate libcurl

View File

@ -869,6 +869,7 @@ CURL_POLL_INOUT 7.14.0
CURL_POLL_NONE 7.14.0 CURL_POLL_NONE 7.14.0
CURL_POLL_OUT 7.14.0 CURL_POLL_OUT 7.14.0
CURL_POLL_REMOVE 7.14.0 CURL_POLL_REMOVE 7.14.0
CURL_PROGRESSFUNC_CONTINUE 7.68.0
CURL_PROGRESS_BAR 7.1.1 - 7.4.1 CURL_PROGRESS_BAR 7.1.1 - 7.4.1
CURL_PROGRESS_STATS 7.1.1 - 7.4.1 CURL_PROGRESS_STATS 7.1.1 - 7.4.1
CURL_PUSH_DENY 7.44.0 CURL_PUSH_DENY 7.44.0

View File

@ -210,6 +210,11 @@ struct curl_httppost {
set. Added in 7.46.0 */ set. Added in 7.46.0 */
}; };
/* This is a return code for the progress callback that, when returned, will
signal libcurl to continue executing the default progress function */
#define CURL_PROGRESSFUNC_CONTINUE 0x10000001
/* This is the CURLOPT_PROGRESSFUNCTION callback prototype. It is now /* This is the CURLOPT_PROGRESSFUNCTION callback prototype. It is now
considered deprecated but was the only choice up until 7.31.0 */ considered deprecated but was the only choice up until 7.31.0 */
typedef int (*curl_progress_callback)(void *clientp, typedef int (*curl_progress_callback)(void *clientp,

View File

@ -594,11 +594,13 @@ int Curl_pgrsUpdate(struct connectdata *conn)
data->progress.size_ul, data->progress.size_ul,
data->progress.uploaded); data->progress.uploaded);
Curl_set_in_callback(data, false); Curl_set_in_callback(data, false);
if(result) if(result != CURL_PROGRESSFUNC_CONTINUE) {
failf(data, "Callback aborted"); if(result)
return result; failf(data, "Callback aborted");
return result;
}
} }
if(data->set.fprogress) { else if(data->set.fprogress) {
int result; int result;
/* The older deprecated callback is set, call that */ /* The older deprecated callback is set, call that */
Curl_set_in_callback(data, true); Curl_set_in_callback(data, true);
@ -608,9 +610,11 @@ int Curl_pgrsUpdate(struct connectdata *conn)
(double)data->progress.size_ul, (double)data->progress.size_ul,
(double)data->progress.uploaded); (double)data->progress.uploaded);
Curl_set_in_callback(data, false); Curl_set_in_callback(data, false);
if(result) if(result != CURL_PROGRESSFUNC_CONTINUE) {
failf(data, "Callback aborted"); if(result)
return result; failf(data, "Callback aborted");
return result;
}
} }
if(showprogress) if(showprogress)