[1] [[メッセージ]]の長さとして指定されているものより実際の長さが短い場合、
その[[メッセージ]]は[DFN[[RUBYB[不完全]@en[incomplete]]]]であるといいます。

* 仕様書

[REFS[
- [30] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-3>
-- [49] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-3.4>
- [2] [CITE@en[RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching]] ([TIME[2014-09-11 10:19:59 +09:00]] 版) <https://tools.ietf.org/html/rfc7234#section-3.1>
]REFS]

* 定義

[12] [CODE(HTTP)@en[[[chunked]]]] [[転送符号化]]を使っている[[メッセージ本体]]は、
長さ0の最後の [[chunk]] を受信していなければ[[不完全]]です [SRC[>>49]]。
そうでないとき[[完全]]です [SRC[>>2]]。

[FIG(corollary)[
[13] [[トレーラー部]]を受信していなくても[[不完全]]ではないことになります。
]FIG]

[3] [CODE(HTTP)@en[[[chunked]]]] の[[復号]]に失敗した時も[[不完全]]な[[メッセージ]]として扱うようです
[SRC[>>49]]。

[6] [[妥当]]な [CODE(HTTP)@en[[[Content-Length:]]]] を持つ[[メッセージ]]は、
[[メッセージ本体]]として受信した[[オクテット]]の長さが
[CODE(HTTP)@en[[[Content-Length:]]]] の長さより小さい時、
[[不完全]]です [SRC[>>49]]。そうでない時[[完全]]です [SRC[>>2]]。

;; [15] [CODE(HTTP)@en[[[Transfer-Encoding:]]]] と [CODE(HTTP)@en[[[Content-Length:]]]]
の両方がある時は [CODE(HTTP)@en[[[Content-Length:]]]] が無視されるので
([[メッセージ本体]]参照。)、 >>12 が適用されます。

[16] [CODE(HTTP)@en[[[chunked]]]] でなく [CODE(HTTP)@en[[[Content-Length:]]]]
もない[[応答メッセージ]]は、[[ヘッダー部]]を受信していれば、
[[HTTP接続]]が閉じられるまでが[[メッセージ本体]]です [SRC[>>49]]。
[[不完全]]なことはありません。

[17] [[要求メッセージ]]は [CODE(HTTP)@en[[[chunked]]]] でなく
[CODE(HTTP)@en[[[Content-Length:]]]] もなければ、
[[メッセージ本体]]の長さが0ですから、[[不完全]]なことはありません。

[14] なお[[ヘッダー部]]と[[空行]]までの途中で終わっている場合、
「[[不完全]]」とはされていませんが、[[クライアント]]は[[応答]]の意味を決定できないので[[要求]]を繰り返す必要があるかもしれない [SRC[>>49]]
とされています。[[鯖]]もおそらく同様で[[要求]]をエラーとして無視するべきなのでしょう。

* 処理

[50] [[不完全]]な[[要求]]を受け取った[[鯖]]は、
[[接続]]を閉じる前に[[誤り応答]]を送信して構いません [SRC[>>49]]。

;; [4] [CODE(HTTP)[[[400]]]] [[応答]]を送るべきと思われます。

;; [5] [CODE(HTTP)@en[[[chunked]]]] [[符号化]]が長さ0の [[chunk]]
を含まない場合、最後の [[chunk]] なしで[[接続]]が閉じられたか、
構文的に [[chunk]] でないデータが続いている場合です。
後者の場合の処理は仕様上明確にされていませんが、実際上は
([CODE(HTTP)[[[400]]]] [[応答]]を送りたければ送って)
[[接続]]を閉じる以外に選択肢がなさそうです。

[51] [[不完全]]な[[応答]]を受け取った[[クライアント]]は、
当該[[メッセージ]]を[[不完全]]と記録しなければ[['''なりません''']] [SRC[>>49]]。

[7] [[不完全]]な[[応答]]の[[状態符号]]が [CODE(HTTP)[[[200]]]] で[[ヘッダー部]]全体を受信していて、[[要求メソッド]]が
[CODE(HTTP)@en[[[GET]]]] だった場合は、[[キャッシュ項目]]を不完全と記しつつ[[蓄積]]しても構いません
[SRC[>>2]]。

[55] >>6 の場合、[[接続]]は閉じなければ[['''なりません''']] [SRC[>>30 3.3.3.]]。

[8] [[キャッシュ]]は、 [CODE(HTTP)@en[[[Range:]]]] と [CODE(HTTP)@en[[[Content-Range:]]]]
と[[範囲単位]]に対応している場合、[[不完全]]な[[応答]]や [CODE(HTTP)[[[206]]]]
[[応答]]を[[蓄積]]して構いません。また[[不完全]]な [CODE(HTTP)[[[200]]]] [[応答]]を 
[CODE(HTTP)[[[206]]]] [[応答]]として[[蓄積]]して構いません。 [SRC[>>2]]

[9] [[キャッシュ]]は、[[不完全]]な[[応答]]の後[[範囲要求]]の結果を結合して完全な[[応答]]を作っても構いません [SRC[>>2]]。

[10] [[キャッシュ]]は、完全にした場合や[[範囲要求]]の[[範囲]]が収まっている場合を除き、
[[不完全]]な[[応答]]を再利用しては[['''なりません''']] [SRC[>>2]]。

;; [11] [[HTTPS]]、[[範囲要求]]も参照。

[18] [CITE@en[Fetch abort & no-cors requests · Issue #563 · whatwg/fetch]]
([TIME[2017-07-11 14:23:27 +09:00]])
<https://github.com/whatwg/fetch/issues/563#issuecomment-314082009>

[19] [CITE@en[Fetch abort & no-cors requests · Issue #563 · whatwg/fetch]]
([TIME[2017-09-22 22:43:37 +09:00]])
<https://github.com/whatwg/fetch/issues/563>