Hướng Dẫn Sử Dụng
Загрузка файлов через прокси: возобновление с помощью HTTP Range при обрыве соединения

Содержание
При загрузке файлов через прокси соединение может оборваться до получения всех данных. Если инструмент загрузки каждый раз начинает заново, пользователю приходится повторно передавать уже полученную часть, что увеличивает время загрузки и создает лишний трафик.
HTTP Range позволяет запрашивать часть ресурса вместо всего содержимого. Однако для безопасного возобновления загрузки необходимо убедиться, что сервер действительно возвращает нужный фрагмент данных, а исходный файл не изменился. В этой статье рассматриваются проверки, обработка ответов и организация процесса возобновления загрузки после обрыва соединения с прокси.
Как HTTP Range помогает возобновлять загрузку файлов?
При обычной загрузке клиент запрашивает весь файл. Если соединение прерывается, локальный файл содержит только те данные, которые удалось получить и записать. Вместо того чтобы отбрасывать эту часть, клиент может отправить новый запрос только на недостающие данные.
Для диапазона байтов заголовок Range задает начальную позицию и при необходимости конечную. При возобновлении загрузки до конца ресурса обычно достаточно указать только начальный байт.
Эта позиция отсчитывается от начала файла с нуля. Если локальный файл уже содержит непрерывный фрагмент данных, начальная позиция следующего запроса равна размеру сохраненного фрагмента в байтах.
Важное условие: исходный файл не должен изменяться между попытками загрузки. Если содержимое изменилось, объединение начала старой версии с окончанием новой приведет к созданию некорректного файла, даже если его итоговый размер выглядит правильным.
Как прокси влияет на возможность возобновления загрузки?
Прокси — это промежуточный компонент, пересылающий трафик. При обрыве соединения с прокси текущая передача может завершиться, но это само по себе не исключает возможность возобновления загрузки. Клиент может открыть новое соединение и запросить недостающую часть данных.
Эта возможность зависит от всей цепочки передачи: сервера, предоставляющего файл, прокси и программы загрузки. Сервер должен корректно обрабатывать запросы Range, прокси — правильно их пересылать, а программа загрузки — проверять ответ перед добавлением данных в конец файла.
Различие между прокси пересылки и прокси с терминацией TLS
При передаче HTTPS через обычный туннель CONNECT прокси не читает и не изменяет напрямую заголовки HTTP внутри TLS-соединения. В этом случае поддержка Range зависит главным образом от целевого сервера и клиента.
Если прокси выполняет терминацию TLS или обрабатывает содержимое HTTP, он может влиять на заголовки, кеширование или представление ресурса. Поэтому проверку следует проводить через тот же прокси, который будет использоваться для загрузки, а не ограничиваться прямым подключением.
Как проверить, поддерживает ли сервер возобновление загрузки
Проверка заголовков с помощью запроса HEAD
Запрос HEAD позволяет просмотреть заголовки без загрузки тела ответа. В curl можно использовать следующий шаблон команды, заменив пример адреса фактическими данными:
curl --head --location --proxy http://proxy.example:PORT https://download.example/archive.zip
Заголовок Accept-Ranges: bytes указывает, что сервер объявляет о поддержке запросов диапазонов байтов. Если ответ содержит Accept-Ranges: none, сервер сообщает, что запросы диапазонов для этого ресурса не поддерживаются.
Однако отсутствие Accept-Ranges еще не означает, что возобновление загрузки невозможно. Некоторые серверы обрабатывают Range, но не объявляют об этой возможности. Кроме того, HEAD может обрабатываться иначе, чем GET, поэтому это лишь предварительная проверка.
Отправка запроса GET с небольшим диапазоном
Практический способ проверки — запросить очень короткий фрагмент файла и изучить ответ. В приведенном ниже примере запрашивается первый байт, а заголовки и тело ответа сохраняются в два отдельных файла:
curl --location --proxy http://proxy.example:PORT --range 0-0 --dump-header range-headers.txt --output range-probe.bin https://download.example/archive.zip
Сервер может проигнорировать Range и вернуть все содержимое. Поэтому такую проверку следует выполнять в тестовой среде с подходящими ограничениями по времени или объему трафика, отслеживая ответ, чтобы при необходимости остановить передачу.
При наличии перенаправлений необходимо читать заголовки конечного ответа, содержащего данные файла. Не следует делать выводы на основании заголовков промежуточного ответа с перенаправлением.
Основные ответы HTTP Range
206 Partial Content: возвращена часть содержимого
Код состояния 206 Partial Content означает, что сервер возвращает часть содержимого. Для запроса одного диапазона заголовок Content-Range описывает возвращаемый диапазон байтов и может указывать общий размер ресурса.
Перед добавлением данных в конец файла необходимо проверить, совпадает ли начальная позиция в Content-Range с запрошенной точкой возобновления. Одного статуса 206 недостаточно, чтобы гарантировать корректное объединение данных.
200 OK: нельзя автоматически добавлять данные в конец файла
Если после отправки Range получен ответ 200 OK, он может содержать весь ресурс. Обычно это происходит потому, что сервер проигнорировал Range или условие проверки версии больше не выполняется.
Не добавляйте тело такого ответа непосредственно в конец недокачанного файла. Остановитесь для проверки или начните повторную загрузку в новый файл. В противном случае начало файла может продублироваться.
416 Range Not Satisfiable: необходимо повторно проверить состояние
Ответ 416 Range Not Satisfiable означает, что запрошенный диапазон не может быть предоставлен. Это может произойти, если начальная позиция находится за пределами текущего ресурса или локальный файл уже содержит все данные.
Не следует автоматически считать такой ответ признаком успешной загрузки. Прежде чем делать вывод, необходимо проверить размер, указанный сервером в Content-Range, если он доступен, сопоставить версии и проверить целостность.
Порядок возобновления загрузки файла после обрыва соединения с прокси
Сохранение временного файла и сведений о версии
Во время загрузки рекомендуется использовать временное имя файла, чтобы другие приложения не приняли незавершенный файл за готовый. Также следует сохранять URL, ETag, Last-Modified и общий размер, если сервер их предоставляет.
ETag помогает идентифицировать версию ресурса. Для использования с If-Range нужен сильный ETag; слабый ETag с префиксом W/ использовать нельзя. Время изменения также можно применять при соблюдении соответствующих условий HTTP, но при наличии сильного ETag оно обычно не является предпочтительным вариантом.
Определение объема успешно записанных данных
После обрыва соединения закройте файл или синхронизируйте его содержимое перед проверкой размера. Точка возобновления должна определяться количеством байтов, действительно сохраненных на диске, а не количеством байтов, полученных программой в память.
Этот подход подходит для последовательной загрузки, когда временный файл содержит непрерывный фрагмент с начала ресурса. При многопоточной загрузке размер файла не доказывает, что все его области заполнены данными; необходимо отдельно отслеживать каждый завершенный фрагмент.
Отправка Range с условием If-Range
В новом запросе Range указывает позицию возобновления, а If-Range содержит валидатор уже загруженной версии. Если версия по-прежнему соответствует этому значению, сервер может вернуть запрошенный фрагмент данных.
Если версия изменилась, сервер может вернуть весь ресурс вместо недостающей части. Клиент должен распознать такой ответ и не объединять его со старыми данными.
Добавление данных в конец файла только после проверки ответа
- Проверяйте код состояния и Content-Range перед открытием файла в режиме добавления.
- Сопоставляйте начальную позицию с размером уже сохраненных данных.
- Проверяйте сведения о версии и представление содержимого.
- Отдельно обрабатывайте ответы с ошибками, страницы входа и содержимое, не являющееся нужным файлом.
- При повторном обрыве заново вычисляйте точку возобновления по фактически сохраненным данным.
Возобновление загрузки файла через прокси с помощью curl
curl поддерживает возобновление загрузки на основании размера существующего выходного файла с помощью параметра --continue-at -. Базовый шаблон команды:
curl --location --proxy http://proxy.example:PORT --continue-at - --output archive.zip.part https://download.example/archive.zip
Если соединение оборвется, можно повторно выполнить команду с тем же выходным файлом. curl определит точку возобновления по локальному файлу и запросит соответствующую часть данных.
Однако эта команда сама по себе не гарантирует, что исходный файл не изменился. Для важных данных необходимо управлять сведениями о версии, условием If-Range и проверкой после загрузки. Не следует использовать перенаправление оболочки в режиме добавления для объединения HTTP-ответов без проверки.
Если прокси требует аутентификации, используйте подходящий механизм управления учетными данными. Не допускайте появления пароля в истории команд, журналах или списке процессов, доступных другим пользователям.
Распространенные причины неудачного возобновления загрузки
Истечение срока действия URL или сеанса авторизации
Срок действия подписанных ссылок на загрузку и сеансов авторизации может истечь во время загрузки. При получении ошибки аутентификации необходимо обновить доступ. Если требуется получить новый URL, перед возобновлением убедитесь, что он по-прежнему указывает на ту же версию ресурса.
Изменение представления содержимого
HTTP Range применяется к представлению, которое отправляет сервер. Если содержимое сжимается или преобразуется по-разному при разных попытках загрузки, позиции байтов могут перестать соответствовать друг другу.
Следует сохранять одинаковые заголовки согласования содержимого. Для двоичных файлов, загрузку которых требуется возобновлять, можно запросить Accept-Encoding: identity и проверить фактический Content-Encoding. Не используйте размер распакованных данных в качестве точки возобновления для сжатого представления.
Смена прокси приводит к изменению ответа
Смена прокси не обязательно лишает возможности возобновить загрузку, но может повлиять на аутентификацию, выбор сервера или получаемое содержимое. После изменения маршрута соединения по-прежнему необходимо проверять версию и возвращаемый диапазон.
Проверка завершенной загрузки перед использованием файла
Правильный размер файла еще не гарантирует правильность его содержимого. После завершения загрузки сравните хеш с эталонным значением, опубликованным доверенным источником, если оно доступно. Для программных пакетов с цифровой подписью рекомендуется проверять подпись по инструкциям издателя.
ETag не обязательно является хешем содержимого, и его не следует по умолчанию использовать как контрольную сумму. Переименовывайте временный файл в окончательное имя только после выполнения необходимых проверок.
Загрузка файлов через прокси с помощью HTTP Range эффективна при одновременном выполнении трех условий: локальный фрагмент данных определен точно, сервер возвращает правильный диапазон, а ресурс остается той же версии. Полное соблюдение этих шагов позволяет возобновлять загрузку после сбоев соединения без ущерба для целостности данных.
Похожие статьи
Хватит читать — пора подключить настоящий прокси?
Residential, ISP, Datacenter или Mobile прокси — готовы за пару минут.
Смотреть продукты