diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 index b077e3b6e..4cdb7ec4b 100644 --- a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 +++ b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3 @@ -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 diff --git a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 index 9bd89db70..9039aa398 100644 --- a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 +++ b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3 @@ -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 diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions index fb37a2dd1..29013b148 100644 --- a/docs/libcurl/symbols-in-versions +++ b/docs/libcurl/symbols-in-versions @@ -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 diff --git a/include/curl/curl.h b/include/curl/curl.h index d35174cec..a6d555819 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -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, diff --git a/lib/progress.c b/lib/progress.c index 2aa929599..60a941ab2 100644 --- a/lib/progress.c +++ b/lib/progress.c @@ -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)