14. Range Requests (Bereichsanfragen)
Clients stoßen oft auf unterbrochene Übertragungen oder müssen nur einen Teil einer großen Darstellung erhalten. Bereichsanfragen sind eine optionale Funktion, die es Clients ermöglicht, einen oder mehrere Teilbereiche der ausgewählten Darstellung anzufordern, anstatt die gesamte Darstellung.
Der Bereichsanfrage-Mechanismus ist in mehreren verschiedenen Szenarien nützlich:
- Teilweise Downloads großer Dateien können in mehrere gleichzeitige Anfragen aufgeteilt werden, wodurch die Gesamtabrufgeschwindigkeit erhöht wird
- Unterbrochene Übertragungen können vom Unterbrechungspunkt aus fortgesetzt werden, anstatt neu zu starten
- Einige Medientypen erlauben inkrementelles Rendering oder Wiedergabe, und Benutzeragenten können mit der Verarbeitung von Daten beginnen, sobald sie empfangen werden
Server sind nicht verpflichtet, Bereichsanfragen zu unterstützen. Ursprungsserver SOLLTEN jedoch Bereichsanfragen unterstützen, da Bereichsanfragen die Netzwerknutzung reduzieren und die Dienstresponsivität verbessern können.
14.1. Range Units (Bereichseinheiten)
Darstellungen können auf verschiedene Weise in Teilbereiche aufgeteilt werden. Eine Bereichseinheit definiert, wie Darstellungsdaten aufgeteilt werden.
range-unit = token
Alle Bereichseinheitennamen unterscheiden nicht zwischen Groß- und Kleinschreibung und SOLLTEN im HTTP Range Unit Registry registriert werden.
14.1.1. Range Specifiers (Bereichsspezifizierer)
Ein Bereichsspezifizierer definiert einen oder mehrere Teilbereiche von Darstellungsdaten.
range-spec = range-unit "=" range-set
range-set = 1#range-spec-value
range-spec-value = int-range / suffix-range / other-range
Bereichseinheiten ermöglichen es Clients anzugeben, welche Art von Bereich sie anfordern.
14.1.2. Byte Ranges (Bytebereiche)
Die Bereichseinheit "bytes" ist für HTTP definiert und repräsentiert Teilbereiche einer Oktetsequenz (d.h. Bytebereiche).
byte-ranges-specifier = bytes-unit "=" byte-range-set
byte-range-set = 1#byte-range-spec
byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
/ suffix-byte-range-spec
suffix-byte-range-spec = "-" suffix-length
first-byte-pos = 1*DIGIT
last-byte-pos = 1*DIGIT
suffix-length = 1*DIGIT
bytes-unit = "bytes"
Der first-byte-pos-Wert gibt den Byte-Offset des ersten Bytes im Bereich an. Der last-byte-pos-Wert gibt den Byte-Offset des letzten Bytes im Bereich an; das heißt, die angegebenen Byte-Positionen sind einschließlich. Byte-Offsets beginnen bei Null.
Beispiele:
bytes=0-499repräsentiert die ersten 500 Bytesbytes=500-999repräsentiert die zweiten 500 Bytesbytes=-500repräsentiert die letzten 500 Bytesbytes=500-repräsentiert alle Bytes ab Byte 500bytes=0-0,-1repräsentiert das erste und letzte Byte
14.2. Range
Das "Range"-Header-Feld wird verwendet, um einen oder mehrere Teilbereiche von Darstellungsdaten anzufordern.
Range = range-unit "=" range-set
Ein Server KANN das Range-Header-Feld ignorieren. Ursprungsserver und Zwischencaches SOLLTEN jedoch Bytebereiche unterstützen, wenn möglich, da Range-Unterstützung eine effiziente Wiederherstellung von teilweise fehlgeschlagenen Übertragungen und teilweisen Abruf großer Darstellungen ermöglicht.
Ein Server MUSS ein Range-Header-Feld ignorieren, das mit einer anderen Anfragemethode als GET empfangen wurde.
Ein Ursprungsserver, der das Range-Header-Feld unterstützt, MUSS, wenn alle Vorbedingungen wahr sind:
- Das Range-Header-Feld ignorieren, wenn es eine Bereichseinheit enthält, die er nicht unterstützt
- Einen 416 (Range Not Satisfiable)-Statuscode zurückgeben, wenn das Range-Header-Feld syntaktisch ungültig ist
- Eine 206 (Partial Content)-Antwort mit einer oder mehreren Teildarstellungen zurückgeben, wenn das Range-Header-Feld einen erfüllbaren Satz von Bytebereichen enthält
Beispielanfrage:
GET /document HTTP/1.1
Host: www.example.com
Range: bytes=0-1023
14.3. Accept-Ranges
Das "Accept-Ranges"-Header-Feld ermöglicht es einem Server anzugeben, dass er Bereichsanfragen für die Zielressource unterstützt.
Accept-Ranges = acceptable-ranges
acceptable-ranges = 1#range-unit / "none"
Ein Ursprungsserver, der Bereichsanfragen für eine bestimmte Zielressource akzeptiert, SOLLTE ein Accept-Ranges-Header-Feld senden, um anzugeben, welche Bereichseinheiten unterstützt werden. Ein Client KANN Bereichsanfragen generieren, ohne dieses Header-Feld zu empfangen.
Beispiele:
Accept-Ranges: bytes
Accept-Ranges: none
Der Wert "none" zeigt an, dass keine Bereichseinheiten akzeptiert werden, was bedeutet, dass der Server keine Bereichsanfragen für diese Ressource unterstützt.
14.4. Content-Range
Das "Content-Range"-Header-Feld wird in einer einteiligen 206 (Partial Content)-Antwort gesendet, um den Bytebereich der enthaltenen Teildarstellung anzugeben, oder in einer 416 (Range Not Satisfiable)-Antwort, um Informationen über die ausgewählte Darstellung bereitzustellen.
Content-Range = range-unit SP
( range-resp / unsatisfied-range )
range-resp = byte-content-range
/ other-range-resp
byte-content-range = bytes-unit SP
( byte-range-resp / unsatisfied-range )
byte-range-resp = first-byte-pos "-" last-byte-pos
"/" ( complete-length / "*" )
complete-length = 1*DIGIT
unsatisfied-range = "*/" complete-length
other-range-resp = *CHAR
Beispiele:
Content-Range: bytes 0-1023/5000
Content-Range: bytes 1024-2047/5000
Content-Range: bytes */5000
Das erste Beispiel zeigt an, dass die ersten 1024 Bytes einer vollständigen Darstellung (mit einer Länge von 5000 Bytes) übertragen werden. Das dritte Beispiel zeigt an, dass eine Bereichsanfrage nicht erfüllt werden konnte, da die vollständige Länge der ausgewählten Darstellung 5000 Bytes beträgt.
14.5. Partial PUT (Teilweises PUT)
Eine teilweise PUT-Anfrage ist keine Bereichsanfrage, verwendet jedoch denselben Mechanismus wie Bereichsanfragen, um den übertragenen Inhalt zu beschreiben. Ein Client kann ein teilweises PUT senden, indem er ein Content-Range-Header-Feld in die PUT-Anfrage einfügt.
Teilweises PUT wird jedoch in der Praxis selten verwendet, weil:
- Es erfordert, dass der Client den aktuellen Zustand der Ressource kennt
- Es ist anfällig für Race Conditions
- Die meisten Ursprungsserver es nicht unterstützen
Daher SOLLTEN Clients kein teilweises PUT verwenden, es sei denn, sie sind sicher, dass der Zielserver es unterstützt.
14.6. Media Type multipart/byteranges (Medientyp multipart/byteranges)
Beim Senden mehrerer Bereiche SOLLTE ein Server den Medientyp multipart/byteranges verwenden.
multipart/byteranges
Jeder Body-Teil dieses Medientyps MUSS Folgendes enthalten:
- Ein Content-Type-Header-Feld, das den Medientyp der in diesem Body-Teil enthaltenen Darstellung angibt
- Ein Content-Range-Header-Feld, das den enthaltenen Bereich angibt
Beispielantwort:
HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
--THIS_STRING_SEPARATES
Content-Type: text/html
Content-Range: bytes 0-100/1234
[erste 101 Bytes]
--THIS_STRING_SEPARATES
Content-Type: text/html
Content-Range: bytes 500-999/1234
[Bytes 500-999]
--THIS_STRING_SEPARATES--
Wenn ein Client mehrere nicht zusammenhängende Bereiche anfordert, SOLLTE ein Server nur dann eine mehrteilige Antwort zurückgeben, wenn:
- Die Bereiche sich nicht überlappen
- Die Reihenfolge der Bereiche mit ihrer Reihenfolge in der Darstellung übereinstimmt
Andernfalls SOLLTE der Server die gesamte Darstellung zurückgeben oder überlappende Bereiche zusammenführen.