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
sizes so a program must be made to handle that.
Returning a non-zero value from this callback will cause libcurl to abort the
transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
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
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
sizes so a program must be made to handle that.
Returning a non-zero value from this callback will cause libcurl to abort the
transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
If your callback function returns CURL_PROGRESSFUNC_CONTINUE it will cause
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
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_OUT 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_STATS 7.1.1 - 7.4.1
CURL_PUSH_DENY 7.44.0

View File

@ -210,6 +210,11 @@ struct curl_httppost {
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
considered deprecated but was the only choice up until 7.31.0 */
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.uploaded);
Curl_set_in_callback(data, false);
if(result)
failf(data, "Callback aborted");
return result;
if(result != CURL_PROGRESSFUNC_CONTINUE) {
if(result)
failf(data, "Callback aborted");
return result;
}
}
if(data->set.fprogress) {
else if(data->set.fprogress) {
int result;
/* The older deprecated callback is set, call that */
Curl_set_in_callback(data, true);
@ -608,9 +610,11 @@ int Curl_pgrsUpdate(struct connectdata *conn)
(double)data->progress.size_ul,
(double)data->progress.uploaded);
Curl_set_in_callback(data, false);
if(result)
failf(data, "Callback aborted");
return result;
if(result != CURL_PROGRESSFUNC_CONTINUE) {
if(result)
failf(data, "Callback aborted");
return result;
}
}
if(showprogress)