Unterschied zwischen Content-Range- und Range-Headern?

74

Was ist der Unterschied zwischen den HTTP-Headern Content-Range und Range? Wann sollte jeder verwendet werden?

Ich versuche, eine Audiodatei von einem bestimmten Byte-Offset zu streamen. Sollte ich Content-Range oder Range-Header verwenden?

Vielen Dank

lostInTransit
quelle

Antworten:

82

Der Bereich wird in der Anforderung verwendet, um nach einem bestimmten Bereich (oder bestimmten Bereichen) von Bytes zu fragen. Der Inhaltsbereich wird in der Antwort verwendet, um anzugeben, welche Bytes der Server Ihnen gibt (die sich möglicherweise von dem von Ihnen angeforderten Bereich unterscheiden) und wie lang der gesamte Inhalt ist (falls bekannt).

Brian Campbell
quelle
7
Lesen Sie die unten stehende Antwort.
Bruno Martinez
2
@BrunoMartinez Während Sie den Inhaltsbereich in der Anforderung verwenden können, wurde aus der Frage, dass das OP Fragen zum Herunterladen von Inhalten mit einem bestimmten Bereich stellte, ziemlich klar. Ich antwortete auf der Grundlage der Fragen des OP und versuchte nicht, eine umfassende Beschreibung aller Fälle zu geben, in denen der Inhaltsbereich verwendet werden konnte.
Brian Campbell
3
@BrianCampbell du bist natürlich richtig. Ich wollte nur meine Ergebnisse für die Nachwelt aufzeichnen. Ich habe meine Antwort bearbeitet, um sicherzustellen, dass sie nicht den Eindruck erweckt, dass Ihre Antwort in irgendeiner Weise falsch ist.
Btimby
3
@btimby Kein Problem! Vielen Dank für eine ausführlichere Erklärung. Es ist immer nützlich, wenn Sie die Seite in einer Google-Suche finden.
Brian Campbell
132

Tatsächlich ist die akzeptierte Antwort nicht vollständig. Der Inhaltsbereich wird nicht nur in Antworten verwendet. Es ist auch legal bei Anfragen, die eine Körperschaft eines Unternehmens bereitstellen.

Beispielsweise stellt ein HTTP-PUT einen Entitätskörper bereit, der möglicherweise nur einen Teil einer Entität bereitstellt. Somit kann die PUT-Anforderung einen Inhaltsbereichskopf enthalten, der dem Server angibt, wo der Teilentitätskörper in die Entität zusammengeführt werden soll.

Lassen Sie uns beispielsweise zuerst eine Datei mit HTTP erstellen und dann an eine Datei anhängen:

Anfrage 1:

PUT /file HTTP/1.1
Host: server
Content-Length: 1

a

Anfrage 2:

PUT /file HTTP/1.1
Host: server
Content-Range: bytes 1-2/*
Content-Length: 1

a

Wie, sehen wir uns den Inhalt der Datei an ...

Anfrage 3:

GET /file HTTP/1.1
Host: server

HTTP/1.1 200 OK
Content-Length: 2

aa

Dies ermöglicht den wahlfreien Zugriff auf Dateien, sowohl LESEN als auch SCHREIBEN über HTTP. Ich wollte nur klarstellen, wie ich die Verwendung von Content-Range in einem von mir entwickelten WebDAV-Client untersucht habe. Vielleicht werden sich diese erweiterten Informationen für andere als nützlich erweisen.

btimby
quelle
7
Der Inhaltsbereich ist bei Anfragen nicht zulässig.
Mark Nottingham
13
Dieser Kommentar ist falsch. RFC2616 ( w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16 ) beschränkt den Content-RangeHeader nicht auf Anforderungen, sondern bindet ihn an einen "partiellen Entitätskörper". Es ist tatsächlich sehr üblich, diese Funktion zu verwenden, um den Upload-Lebenslauf oder das Chunked-Upload zu vereinfachen.
Hank
3
Ich denke, Content-Rangekann in Anfragen verwendet werden. Weitere Informationen finden Sie im Abschnitt zur PUT-Methode: w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6 - The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not understand or implement and MUST return a 501 (Not Implemented) response in such cases.- Eine Anforderung enthält möglicherweise den Content-RangeHeader, und der Server sollte dies berücksichtigen.
Nietaki
2
@nietaki Sicher, aber das ist nicht dasselbe wie zu sagen, dass es tatsächlich funktioniert, wie der Antwortende beschreibt - ich meine, es ist eine garantierte 501.
Aaron Miller
6
@ BeniCherniavsky-Paskin Wenn ich in Abschnitt 4.3.4 eher tools.ietf.org/html/rfc7231 als eine Entwurfsversion betrachte, sehe ich "Ein Ursprungsserver, der PUT für eine bestimmte Zielressource ermöglicht, MUSS eine 400-Antwort (Bad Request) an a senden PUT-Anforderung, die ein Inhaltsbereich-Headerfeld (...) enthält ". Sicherlich sind Autoren von RFCs nur Menschen und sie machen Fehler und RFCs entwickeln sich unter Schmerzen, aber der Content-Range-Header war eindeutig nicht für Anfragen gedacht und macht auch keinen Sinn.
Hermes