I would suggest that the progress report be sent back based on how much time has passed since last time rather than how many bytes. It would be fairly easy to just put a check inside of fire_download_progress() to make sure we didn't just send one. That way, for slow downloads, the user can still get responsive data about it.