417 Expectation Failed
Verwendung
Wenn die Fehlermeldung 417 Expectation Failed empfangen wird, hat der Client im Expect-Header der Anfrage eine oder mehrere Bedingungen für die proaktive Aushandlung angegeben. Dies hängt mit der informativen 100-Antwort zusammen.
Wird eine Anfrage mit dem Header Expect: 100-continue gesendet, prüft der Server die relevanten Details der Anfrage. Dazu gehören die Header-Felder Content-Type oder Content-Length. Ist der Server bereit, den Nachrichtenbody anzunehmen, wird die informative 100-Antwort zurückgegeben.
Ist der Server nicht bereit, den Nachrichtenbody anzunehmen, wird ein passender Status gesendet, etwa 401 oder 405. Der Fehler 417 Expectation Failed wird nur dann zurückgegeben, wenn der Server oder die Antwortkette keine Expectations unterstützt. Erhält der Client diese Meldung, sendet er die Anfrage ohne den Expect-Header erneut.
SEO-Auswirkung
Suchmaschinen wie Google indexieren keine URL mit dem Antwortstatus 417 Expectation Failed. Zuvor indexierte URLs werden aus den Suchergebnissen entfernt.
Besonderheiten für Clients
Ein Client, der Expect: 100-continue sendet, muss keine bestimmte Zeitspanne abwarten. Der Client überträgt den Nachrichtenbody, ohne zuvor eine Antwort erhalten zu haben. Da HTTP/1.0-Server keine Expectations unterstützen, wartet der Client, wenn ein solcher Server als Vermittler eingesetzt wird, nicht unbegrenzt lange, bevor er den Nachrichtenbody überträgt.
Besonderheiten für Server
Empfängt ein Server Expect: 100-continue als Teil einer HTTP/1.0-Anfrage, muss die Expectation ignoriert werden. Der Server muss nicht mit 100 bestätigen, wenn der Nachrichtenbody bereits empfangen wurde oder kein Nachrichtenbody vorhanden ist.
Sendet ein Server 100, muss letztlich ein endgültiger Status wie 200 folgen, sofern die Verbindung nicht vorher abgebrochen wird.
Antwortet ein Server mit der endgültigen Antwort, bevor er den gesamten Nachrichtenbody empfangen hat, zeigt die Antwort an, was der Server mit der Verbindung vorhat: die Verbindung schließen oder weiterlesen und die Anfragenachricht verwerfen.
Beispiel
Der Client bittet darum, eine 10K große PDF-Datei senden zu dürfen. Der Server antwortet mit 417 Expectation Failed, da Expectations nicht unterstützt werden.
Anfrage
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
Expect: 100-continue
Antwort
HTTP/1.1 417 Expectation Failed
Content-Type: text/html
Content-Length: 159
<html>
<head>
<title>Expectations not supported</title>
</head>
<body>
<p>Expectations are not supported by this server.
</p>
</body>
</html>
Behebung
Entfernen Sie den Header Expect: 100-continue und senden Sie die Anfrage mit vollständig enthaltenem Body erneut. Der Server oder ein vermittelnder Proxy unterstützt den 100-continue-Mechanismus nicht.
Viele HTTP-Client-Bibliotheken fügen den Header Expect: 100-continue bei großen Nutzlasten automatisch und ohne ausdrückliche Anweisung hinzu. Deaktivieren Sie dieses Verhalten auf Ebene der Bibliothek:
Probleme mit Proxys und Vermittlern. HTTP/1.0-Proxys, Load-Balancer und ältere Gateways verstehen den Expect: 100-continue-Handshake nicht. Läuft die Anfrage über einen solchen Vermittler, weist der Proxy die Anfrage zurück, bevor der Ursprungsserver die Expectation verarbeitet. Ein Upgrade des Proxys oder eine Routenführung an HTTP/1.0-Vermittlern vorbei löst das Problem in diesen Umgebungen.
Auf Serverseite ist dieser Status in modernen HTTP-Stacks selten. Die meisten Server berücksichtigen entweder Expect: 100-continue oder ignorieren den Header stillschweigend. Die Rückgabe von 417 ist ein bewusstes Signal, die Expectation aus der Anfrage zu entfernen.
Code-Referenzen
.NET
HttpStatusCode.ExpectationFailed
Rust
http::StatusCode::EXPECTATION_FAILED
Rails
:expectation_failed
Go
http.StatusExpectationFailed
Symfony
Response::HTTP_EXPECTATION_FAILED
Python3.5+
http.HTTPStatus.EXPECTATION_FAILED
Java
HttpServletResponse.SC_EXPECTATION_FAILED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_EXPECTATION_FAILED
Angular
@angular/common/http/HttpStatusCode.ExpectationFailed