HTTPQUERY
日本語

100 Continue

使い方

Expect ヘッダーを含めるクライアントは、メッセージボディを送信する前に、サーバーがそれを受け取る準備ができていることを確認したいと考えています。メッセージボディが大きい場合、サーバーが受け付けないコンテンツタイプを使っている場合、またはユーザーにファイル送信の権限がない場合、この処理によってボディ送信前にそれらの条件が検証されます。

100 Continue ステータスコードが届くと、メッセージボディが送信されます。サーバーが代わりに 417 を返した場合、クライアントは続行しません。

Expect ヘッダーと 100-continue を使う利点は、サーバーが受信・処理する内容を選別する場合に帯域を節約できることです。

欠点は、HTTP リクエストのヘッダーとボディが別々に送信されることです。一部の環境ではそれらが分離されやすく、HTTP リクエストを処理せずにエラーを返してしまうことがあります。

例

リクエスト

PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 99000
Expect: 100-continue

レスポンス

HTTP/1.1 100 Continue

リクエストの続き

<PDF file contents are sent as message body>

最終レスポンス

HTTP/1.1 200 OK

クライアントは処理のために 99 KB の PDF ファイルをサーバーへ送信する予定であり、それを HTTP リクエストで示して事前の検証を求めます。サーバーは肯定的に応答し、クライアントはメッセージボディを送信します。最終レスポンスとして、サーバーは成功を示して HTTP セッションを終了します。

あるいは、サーバーはエラーで応答します。

HTTP/1.1 417 Expectation Failed

この場合、クライアントは PDF を送信せず、それ以降のやり取りは新しい HTTP リクエストから始まります。

クライアントライブラリにおける Expect100Continue

多くの HTTP クライアントライブラリは、設定可能なプロパティとして Expect100Continue を公開しています。.NET では、ServicePointManager.Expect100Continue が POST と PUT のリクエストに Expect: 100-continue ヘッダーを自動的に含めるかどうかを制御します。このプロパティを無効にすると事前チェックが省略され、ボディが直ちに送信されます。

コードリファレンス

.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