206 Partial Content
Uso
El código de estado 206 Partial Content se devuelve en respuesta a una solicitud que contiene una o varias cabeceras Range. La cabecera Range especifica qué partes del documento devuelve el servidor, y este puede entregar opcionalmente los datos como un documento multipart.
Cuando se especifica una sola cabecera Range, la cabecera Content-Length refleja el tamaño del rango transferido (el contenido), la cabecera Content-Type coincide con el tipo del documento y una cabecera Content-Range indica qué sección se incluye. El tamaño completo del documento aparece en el campo complete-length de la cabecera Content-Range. Los datos solicitados vienen a continuación en el cuerpo del mensaje.
Para varios rangos, la cabecera Content-Length indica el total de bytes del cuerpo del mensaje. La cabecera Content-Type inicial se establece en multipart/byteranges, y los pares Content-Type / Content-Range siguientes describen cada rango. El servidor no incluye un campo Content-Range en la cabecera inicial.
En las solicitudes de varios rangos, el servidor puede fusionar opcionalmente los rangos solapados o aquellos separados por un hueco menor que el coste de enviar una parte adicional. Esto se hace por eficiencia, de modo que recibir menos partes de las solicitadas no indica necesariamente un error. Lo contrario no es cierto: un servidor no genera varias partes cuando solo se solicita un único rango.
Además del número de rangos, tampoco se garantiza el orden de las partes. El servidor se esfuerza por enviar los rangos en el mismo orden en que se solicitaron, pero esto no siempre resulta práctico.
Con independencia de cuántos rangos se hayan solicitado, la cabecera Content-Range incluye el tamaño total del recurso. Cuando ese tamaño se desconoce en el momento de la respuesta, el valor se indica con un asterisco.
Cuando el servidor no puede devolver los rangos solicitados, se devuelve un código de estado 416. Algunos servidores devuelven en su lugar un 200 con el documento completo en el cuerpo del mensaje.
Ejemplo de obtención de un solo rango
El cliente solicita un bloque de datos dentro de un archivo de vídeo mediante la cabecera Range. El servidor devuelve el rango solicitado e indica que se trata de un vídeo codificado en MP4.
Solicitud
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=25000-75000
Respuesta
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>
Respuesta alternativa cuando se desconoce el tamaño total
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/*
<50,001 bytes of video data>
Ejemplo de obtención de varios rangos
Cuando se solicita más de un rango, el cliente especifica cada rango en la solicitud. Los rangos se colocan en líneas distintas o separados por comas en la misma línea. El servidor utiliza un separador de cadena para marcar la frontera entre las partes de cada rango.
Solicitud
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=100-250, 1500-2000, 5000-5200
Respuesta
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--
Descargas reanudables
La respuesta 206 Partial Content hace posibles las descargas reanudables. Cuando una transferencia se interrumpe, el cliente envía una nueva solicitud con una cabecera Range que comienza en el último byte recibido. El servidor devuelve los datos restantes como una respuesta 206 en lugar de retransmitir el recurso completo. Los gestores de descargas y herramientas como curl —continue-at - se apoyan en este mecanismo.
Referencias de código
.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