HTTPQUERY
日本語

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