curl: limit -# update frequency for unknown total size

Make it use a max 10Hz update frequency for this case as well. Return
early if the "point" hasn't moved since last invoke.

Reported-by: Elliot Saba

Fixes #2158
Closes #2163
This commit is contained in:
Daniel Stenberg 2017-12-07 09:29:58 +01:00
parent 546e7db78c
commit b5881d1fbd
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
1 changed files with 25 additions and 8 deletions

View File

@ -61,14 +61,27 @@ int tool_progress_cb(void *clientp,
/* we've come this far */ /* we've come this far */
point = dlnow + ulnow + bar->initial_size; point = dlnow + ulnow + bar->initial_size;
if(bar->calls && (tvdiff(now, bar->prevtime) < 100L) && point < total) if(bar->calls) {
/* after first call, limit progress-bar updating to 10 Hz */ /* after first call... */
/* update when we're at 100% even if last update is less than 200ms ago */ if(total) {
return 0; /* we know the total data to get... */
if(bar->prev == point)
if(point > total) /* progress didn't change since last invoke */
/* we have got more than the expected total! */ return 0;
total = point; else if((tvdiff(now, bar->prevtime) < 100L) && point < total)
/* limit progress-bar updating to 10 Hz except when we're at 100% */
return 0;
}
else {
/* total is unknown */
if(bar->prev/1024 == point/1024)
/* the same kilobyte level as last invoke */
return 0;
else if(tvdiff(now, bar->prevtime) < 100L)
/* limit progress-bar updating to 10 Hz */
return 0;
}
}
/* simply count invokes */ /* simply count invokes */
bar->calls++; bar->calls++;
@ -82,6 +95,10 @@ int tool_progress_cb(void *clientp,
} }
} }
else if(point != bar->prev) { else if(point != bar->prev) {
if(point > total)
/* we have got more than the expected total! */
total = point;
frac = (double)point / (double)total; frac = (double)point / (double)total;
percent = frac * 100.0; percent = frac * 100.0;
barwidth = bar->width - 7; barwidth = bar->width - 7;