100 Continue
Verwendung
Clients, die den Expect-Header senden, wollen vor der Übertragung bestätigt bekommen, dass der Server zum Empfang des Nachrichtenrumpfs bereit ist. Wenn ein Nachrichtenrumpf groß ist, einen vom Server nicht akzeptierten Inhaltstyp verwendet oder dem Benutzer die Berechtigung zum Senden von Dateien fehlt, prüft dieser Ablauf diese Bedingungen, bevor der Rumpf gesendet wird.
Sobald der Statuscode 100 Continue eintrifft, wird der Nachrichtenrumpf gesendet. Gibt der Server stattdessen 417 zurück, fährt der Client nicht fort.
Der Vorteil der Kombination aus Expect-Header und 100-continue besteht darin, Bandbreite zu sparen, wenn der Server wählerisch ist, welche Inhalte er empfängt und verarbeitet.
Der Nachteil ist, dass HTTP-Anfrage-Header und -Rumpf unabhängig voneinander gesendet werden. In manchen Umgebungen werden beide leicht voneinander getrennt, sodass ein Fehler zurückgegeben wird, statt die HTTP-Anfrage zu verarbeiten.
Beispiel
Anfrage
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 99000
Expect: 100-continue
Antwort
HTTP/1.1 100 Continue
Fortsetzung der Anfrage
<PDF file contents are sent as message body>
Endgültige Antwort
HTTP/1.1 200 OK
Der Client plant, eine 99 KB große PDF-Datei zur Verarbeitung an den Server zu senden, kündigt dies in der HTTP-Anfrage an und bittet um eine vorherige Validierung. Der Server antwortet zustimmend, woraufhin der Client den Nachrichtenrumpf sendet. Als endgültige Antwort schließt der Server die HTTP-Sitzung mit einer Erfolgsmeldung ab.
Alternativ antwortet der Server mit einem Fehler:
HTTP/1.1 417 Expectation Failed
In dieser Situation sendet der Client das PDF nicht, und die weitere Kommunikation beginnt mit einer neuen HTTP-Anfrage.
Expect100Continue in Client-Bibliotheken
Viele HTTP-Client-Bibliotheken stellen Expect100Continue als konfigurierbare Eigenschaft bereit. In .NET steuert ServicePointManager.Expect100Continue, ob POST- und PUT-Anfragen automatisch den Header Expect: 100-continue enthalten. Wird diese Eigenschaft deaktiviert, entfällt die vorherige Prüfung und der Rumpf wird sofort gesendet.
Code-Referenzen
.NET
HttpStatusCode.Continue
Rust
http::StatusCode::CONTINUE
Rails
:continue
Go
http.StatusContinue
Symfony
Response::HTTP_CONTINUE
Python3.5+
http.HTTPStatus.CONTINUE
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_CONTINUE
Angular
@angular/common/http/HttpStatusCode.Continue