Проблема с большими загрузками в Firefox

Firefox версии 28 и всех её современных преемников с 2014 года поставляется с параметром network.http.response.timeout, установленным в 300 секунд. Это, похоже, мешает возобновлению больших загрузок и в целом снижает стабильность при работе с крупными файлами.

Установка network.http.response.timeout на 0 (или какое-то очень большое значение) в about:config делает большие загрузки не только возобновляемыми, но и заметно более стабильными. Механизм, по которому это работает, остаётся неясным, но экспериментальные тесты подтверждают эффективность подхода.

Когда помощь возможна и когда нет

Следует помнить, что данное решение работает только если сервер поддерживает возобновляемые загрузки. Если сервер такой поддержки не обеспечивает, никакие настройки Firefox или других браузеров не помогут. Реальная проблема, которую это исправляет, — неспособность Firefox возобновить загрузку, которая теоретически может быть возобновлена при разрыве соединения.

Похоже, возобновляемые загрузки в Firefox опираются на тайм-ауты соединения, а не на файлы с расширением .part, которые браузер загружает. Без этого параметра Firefox спокойно игнорирует существующий .part-файл — и почему это происходит, остаётся загадкой.

Известная нестабильность и альтернативы

Возобновляемые загрузки в Firefox в целом остаются довольно нестабильной функцией. Эта проблема в той или иной форме существует с 2005 года. Кроме того, существует обходной приём с ручным переименованием .part-файлов, чтобы заставить Firefox действительно возобновить загрузку, но это требует лишних манипуляций.

Если использовать альтернативный инструмент, команда wget -c -O "$filename" "$url" работает надёжнее, и в целом wget демонстрирует большую стабильность при работе с большими файлами.

Скрытые повторные попытки Firefox

Есть основания подозревать, что Firefox выполняет скрытые повторные попытки перед тем, как объявить загрузку несостоявшейся. Экспериментальные тесты показывают, что это, по крайней мере частично, связано с network.http.response.timeout, и что превышение тайм-аута нарушает этот процесс.

Источник кода Firefox не был тщательно изучен для подтверждения этих наблюдений — было неясно, где искать релевантный код.