206 Partial Content
Verwendung
Der Statuscode 206 Partial Content wird als Antwort auf eine Anfrage zurückgegeben, die einen oder mehrere Range-Header enthält. Ein Range-Header gibt an, welche Teile des Dokuments der Server zurückgibt, wobei der Server die Daten wahlweise als mehrteiliges (multipart) Dokument ausliefert.
Wird ein einzelner Range-Header angegeben, spiegelt der Content-Length-Header die Größe des übertragenen Bereichs (also des Inhalts) wider, der Content-Type-Header entspricht dem Dokumenttyp und ein Content-Range-Header gibt an, welcher Abschnitt enthalten ist. Die vollständige Dokumentgröße erscheint im Feld complete-length des Content-Range-Headers. Die angeforderten Daten folgen im Nachrichten-Body.
Bei mehreren Bereichen gibt der Content-Length-Header die Gesamtzahl der Bytes im Nachrichten-Body an. Der anfängliche Content-Type-Header wird auf multipart/byteranges gesetzt, und nachfolgende Content-Type-/Content-Range-Paare beschreiben jeden Bereich. Der Server nimmt kein Content-Range-Feld in den anfänglichen Header auf.
Bei Anfragen mit mehreren Bereichen führt der Server wahlweise überlappende Bereiche zusammen oder solche, die durch eine Lücke getrennt sind, die kleiner ist als der Mehraufwand für das Senden eines zusätzlichen Teils. Dies geschieht aus Effizienzgründen, sodass der Empfang von weniger Teilen als angefordert nicht zwangsläufig auf einen Fehler hindeutet. Die Umkehrung gilt nicht: Ein Server erzeugt keine mehreren Teile, wenn nur ein einzelner Bereich angefordert wurde.
Abgesehen von der Anzahl der Bereiche ist auch die Reihenfolge der Teile nicht garantiert. Ein Server bemüht sich, die Bereiche in derselben Reihenfolge zu senden, in der sie angefordert wurden, doch das ist nicht immer praktikabel.
Unabhängig davon, wie viele Bereiche angefordert wurden, enthält der Content-Range-Header die Gesamtgröße der Ressource. Ist die Größe zum Zeitpunkt der Antwort unbekannt, steht ein Sternchen für diesen Wert.
Kann der Server die angeforderten Bereiche nicht zurückgeben, wird der Statuscode 416 zurückgegeben. Manche Server geben stattdessen ein 200 mit dem gesamten Dokument im Nachrichten-Body zurück.
Beispiel für den Abruf eines einzelnen Bereichs
Der Client fordert mit dem Range-Header einen Datenblock innerhalb einer Videodatei an. Der Server gibt den angeforderten Bereich zurück und weist dabei auf ein MP4-kodiertes Video hin.
Anfrage
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=25000-75000
Antwort
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>
Alternative Antwort, wenn die Gesamtgröße unbekannt ist
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
Content-Length: 50001
Content-Range: bytes 25000-75000/*
<50,001 bytes of video data>
Beispiel für den Abruf mehrerer Bereiche
Wird mehr als ein Bereich angefordert, gibt der Client jeden Bereich in der Anfrage an. Die Bereiche stehen auf verschiedenen Zeilen oder kommagetrennt auf derselben Zeile. Der Server verwendet einen Zeichenketten-Trenner, um die Grenze zwischen den Bereichsteilen zu kennzeichnen.
Anfrage
GET /videos/sample.mp4 HTTP/1.1
Host: example.com
Range: bytes=100-250, 1500-2000, 5000-5200
Antwort
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--
Fortsetzbare Downloads
Die Antwort 206 Partial Content ermöglicht fortsetzbare Downloads. Wird eine Übertragung unterbrochen, sendet der Client eine neue Anfrage mit einem Range-Header, der beim zuletzt empfangenen Byte beginnt. Der Server gibt die verbleibenden Daten als 206-Antwort zurück, statt die gesamte Ressource erneut zu übertragen. Download-Manager und Werkzeuge wie curl —continue-at - stützen sich auf diesen Mechanismus.
Code-Referenzen
.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