206 Partial Content
Применение
Код состояния 206 Partial Content возвращается в ответ на запрос, содержащий один или несколько заголовков Range. Заголовок Range указывает, какие части документа возвращает сервер, и сервер может при необходимости передать данные в виде многочастного документа.
Когда указан один заголовок Range, заголовок Content-Length отражает размер передаваемого диапазона (содержимого), заголовок Content-Type соответствует типу документа, а заголовок Content-Range указывает, какой участок включён. Полный размер документа приводится в поле complete-length заголовка Content-Range. Запрошенные данные следуют в теле сообщения.
Для нескольких диапазонов заголовок Content-Length указывает общее число байтов в теле сообщения. Начальный заголовок Content-Type устанавливается в multipart/byteranges, а последующие пары Content-Type / Content-Range описывают каждый диапазон. В начальном наборе заголовков сервер не указывает поле Content-Range.
В запросах с несколькими диапазонами сервер может объединять перекрывающиеся диапазоны или те, что разделены промежутком меньшим, чем накладные расходы на отправку дополнительной части. Это делается ради эффективности, поэтому получение меньшего числа частей, чем было запрошено, не обязательно означает ошибку. Обратное неверно: сервер не формирует несколько частей, когда запрошен только один диапазон.
Помимо количества диапазонов, не гарантируется и порядок частей. Сервер старается отправлять диапазоны в том же порядке, в каком они были запрошены, но это не всегда практично.
Независимо от того, сколько диапазонов было запрошено, заголовок Content-Range включает полный размер ресурса. Когда на момент ответа размер неизвестен, значение обозначается звёздочкой.
Когда сервер не может вернуть запрошенные диапазоны, возвращается код состояния 416. Некоторые серверы вместо этого возвращают 200 со всем документом в теле сообщения.
Пример получения одного диапазона
Клиент запрашивает блок данных внутри видеофайла с помощью заголовка Range. Сервер возвращает запрошенный диапазон, указывая, что это видео в кодировке MP4.
Запрос
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=25000-75000
Ответ
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/100000
<50,001 bytes of video data>
Альтернативный ответ, когда общий размер неизвестен
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/*
<50,001 bytes of video data>
Пример получения нескольких диапазонов
Когда запрошено более одного диапазона, клиент указывает каждый диапазон в запросе. Диапазоны размещаются на разных строках или перечисляются через запятую в одной строке. Для обозначения границы между частями диапазонов сервер использует строку-разделитель.
Запрос
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=100-250, 1500-2000, 5000-5200
Ответ
HTTP/1.1 206 Partial Content
Content-Length: 1115
Content-Type: multipart/byteranges; boundary=range_sep
--range_sep
Content-Type: video/mp4
Content-Range: bytes 100-250/75000
<151 bytes of video data as the first range>
--range_sep
Content-Type: video/mp4
Content-Range: bytes 1500-2000/75000
<501 bytes of video data as the second range>
--range_sep
Content-Type: video/mp4
Content-Range: bytes 5000-5200/75000
<201 bytes of video data as the third range>
--range_sep--
Возобновляемые загрузки
Ответ 206 Partial Content делает возможными возобновляемые загрузки. Когда передача прерывается, клиент отправляет новый запрос с заголовком Range, начинающимся с последнего полученного байта. Сервер возвращает оставшиеся данные ответом 206, а не передаёт весь ресурс заново. Менеджеры загрузок и инструменты вроде curl —continue-at - опираются на этот механизм.
Примеры кода
.NET
HttpStatusCode.PartialContent
Rust
http::StatusCode::PARTIAL_CONTENT
Rails
:partial_content
Go
http.StatusPartialContent
Symfony
Response::HTTP_PARTIAL_CONTENT
Python3.5+
http.HTTPStatus.PARTIAL_CONTENT
Java
java.net.HttpURLConnection.HTTP_PARTIAL
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_PARTIAL_CONTENT
Angular
@angular/common/http/HttpStatusCode.PartialContent