Content-Range для возобновления файла неизвестной длины
Я создаю ZIP архив на лету неизвестной длины из существующего материала (используя Node), который уже сжат. В архиве ZIP файлы просто сохраняются; ZIP используется только для одного контейнера. Вот почему кэширование созданных ZIP-файлов не имеет смысла - здесь нет реальных вычислений.
Пока все хорошо. Теперь я хочу разрешить возобновление загрузки, и я читаю о HTTP-заголовках Accept-Range, Range и Content-Range. Клиент с прерванной загрузкой будет запрашивать открытый диапазон, скажем: Range: bytes=8000000-
,
Как мне ответить на это? Мой ответ должен включать заголовок Content-Range и там, согласно RFC 2616 § 14.16:
В отличие от значений спецификаторов диапазонов байтов (см. Раздел 14.35.1), спецификация байтового диапазона ДОЛЖНА указывать только один диапазон и ДОЛЖНА содержать абсолютные позиции байтов как для первого, так и для последнего байта диапазона.
Поэтому я не могу просто отправить "все, начиная с позиции X", я должен указать и последний отправленный байт - либо отправив только часть известного размера, либо предварительно рассчитав длину. Обе идеи не удобны для моей ситуации. Есть ли другая возможность?
2 ответа
Отвечаю себе: похоже, мне нужно выбирать между (1) кусочным кодированием файла еще неизвестной длины или (2) зная его Content-Length (или, по крайней мере, размер текущей части), что позволяет возобновить загрузку (а также для индикаторов выполнения).
Я могу с этим смириться - для каждого из моих ZIP-файлов длина будет одинаковой, поэтому я могу хранить ее где-нибудь и использовать повторно для последующих загрузок. Я просто удивлен, что протокол HTTP не позволяет возобновлять загрузку неизвестной длины.
Ответ с "multipart/byteranges" Content-Type, включая поля Content-Range для каждой части.
Обоснование:
При ответе на запросы с заголовком "Range" успешные частичные ответы должны сообщать 206 код состояния HTTP ( раздел 14.35.1 "Диапазоны байтов")
В ответе 206 предлагается либо заголовок "Content-Range", либо Content-Type "multipart/byteranges" ( 10.2.7 206 Partial Content)
Заголовок "Content-Range" не может быть добавлен к ответу, так как он не позволяет опускать конечную позицию, поэтому единственный левый способ - использовать Content-Type "multipart/byteranges"