417 Expectation Failed
使い方
417 Expectation Failed のエラーメッセージを受け取った場合、クライアントはリクエストの Expect ヘッダーで、先行的ネゴシエーションのための条件を1つ以上指定しています。これは情報レスポンスの 100 に関連します。
Expect: 100-continue ヘッダーを使ってリクエストが送信されると、サーバーはリクエストの関連する詳細を調べます。これには Content-Type や Content-Length のヘッダーフィールドが含まれます。サーバーがメッセージボディを受け入れる用意がある場合、100 の情報レスポンスが返されます。
サーバーがメッセージボディを受け入れる用意がない場合は、401 や 405 など適切なステータスが送信されます。417 Expectation Failed エラーは、サーバーまたはレスポンスの経路が expectation をサポートしていない場合にのみ返されます。このメッセージを受け取った場合、クライアントは Expect ヘッダーなしでリクエストを再送信します。
SEO への影響
Google のような検索エンジンは、417 Expectation Failed のレスポンスステータスを持つ URL をインデックスしません。以前にインデックスされていた URL は検索結果から削除されます。
クライアント側の特別な考慮事項
Expect: 100-continue を送信するクライアントは、特定の時間だけ待つことを求められません。クライアントは、先にレスポンスを受け取ることなくメッセージボディの送信に進みます。HTTP/1.0 のサーバーは expectation をサポートしないため、それが中間装置として使われている場合、クライアントはメッセージボディを送信するまでに無期限に待つことはしません。
サーバー側の特別な考慮事項
サーバーが HTTP/1.0 リクエストの一部として Expect: 100-continue を受け取った場合、その expectation は無視しなければなりません。メッセージボディをすでに受信している場合やメッセージボディが存在しない場合、サーバーは 100 で確認する必要はありません。
サーバーが 100 を送信した場合、事前に接続が切断されない限り、最終的に 200 のような最終ステータスが続かなければなりません。
サーバーがメッセージボディ全体を受信する前に最終レスポンスを返す場合、そのレスポンスは接続に対してサーバーが何をするつもりか、すなわち接続を閉じるのか、読み取りを続けてリクエストメッセージを破棄するのかを示します。
例
クライアントが 10K の PDF ファイルの送信を要求します。expectation がサポートされていないため、サーバーは 417 Expectation Failed で応答します。
リクエスト
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
Expect: 100-continue
レスポンス
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>
対処方法
Expect: 100-continue ヘッダーを削除し、完全なボディを含めてリクエストを再送信します。サーバーまたは中間のプロキシが 100-continue の仕組みをサポートしていません。
多くの HTTP クライアントライブラリは、明示的な指示なしに大きなペイロードに対して Expect: 100-continue ヘッダーを自動的に追加します。この挙動はライブラリのレベルで無効化します。
プロキシと中間装置の問題。HTTP/1.0 のプロキシ、ロードバランサー、古いゲートウェイは Expect: 100-continue のハンドシェイクを理解しません。リクエストがそうした中間装置を通過すると、オリジンサーバーが expectation を処理する前にプロキシがリクエストを拒否します。こうした環境では、プロキシをアップグレードするか、HTTP/1.0 の中間装置を迂回する経路を取ることで問題が解決します。
サーバー側では、このステータスは現代の HTTP スタックではまれです。ほとんどのサーバーは Expect: 100-continue を尊重するか、そのヘッダーを黙って無視します。417 を返すことは、リクエストから expectation を取り除くようにという意図的なシグナルです。
コードリファレンス
.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