[419] [DFN[[CODE(HTTP)[[[411]]]]]] ([DFN[[[Length Required]]]])
は、 [CODE(HTTP)@en[[[Content-Length:]]]] [[ヘッダー]]を[[要求]]に含める必要があることを示す[[状態符号]]です。

* 仕様書

[REFS[
- [416] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-6.5.10>'''
- [413] [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.3.3>
]REFS]

* 意味

[417] [CODE(HTTP)[[[411]]]] は、 [CODE(HTTP)@en[[[Content-Length:]]]]
なしの[[要求]]を[[鯖]]が拒んだことを示す[[状態符号]]です [SRC[>>416]]。

* 文脈

[412] [[鯖]]は、[[メッセージ本体]]が含まれているにも関わらず [CODE(HTTP)[[[Content-Length:]]]]
が含まれていなければ、 [CODE(HTTP)[[[411]]]] を返して構いません [SRC[>>320]]。

[415] [CODE(HTTP)@en[[[Transfer-Encoding:]]]] があると
[CODE(HTTP)@en[[[Content-Length:]]]] は無視されることになっていて、
[CODE(HTTP)[[[411]]]] を返す必要はないはずですが、明示的に禁止はされていないようです。
[[RFC 7230]] には、 [CODE(HTTP)[[[chunked]]]] であっても
[CODE(HTTP)[[[Content-Length:]]]] がないと [CODE(HTTP)[[[411]]]]
を返す実装がある [SRC[>>413]] 旨が指摘されています。

[FIG(corollary)[
[420] [[HTTP]] [[クライアント]]には [CODE(HTTP)@en[[[Content-Length:]]]]
なしで [CODE(HTTP)@en[[[POST]]]] などの[[要求]]を送信するものがあり、また
[[HTTP]] 仕様上もそれが認められています。一方で [[HTTP]] [[鯖]]には
[CODE(HTTP)@en[[[Content-Length:]]]] が指定されていないと [CODE(HTTP)[[[411]]]]
を返すものがあり、 [[HTTP]] 仕様上もそれが認められています。

[421] 当然の帰結として、 [CODE(HTTP)@en[[[Content-Length:]]]] [[ヘッダー]]を送信しない[[クライアント]]や
[CODE(HTTP)[[[411]]]] を送信する[[鯖]]は、[[相互運用性]]が低い、
好ましくない実装ということになります。
ただし [CODE(HTTP)@en[[[Content-Length:]]]] なしで [CODE(HTTP)@en[[[Transfer-Encoding:]] [[chunked]]]]
を使うのは [[HTTP/1.1]] では基本的な構文なので、どちらかといえば
[CODE(HTTP)[[[411]]]] を返す[[鯖]]が好ましくないということになります。
]FIG]

* 処理モデル

[418] [[クライアント]]は、[[要求メッセージ]]の[[メッセージ本体]]の長さを
[CODE(HTTP)@en[[[Content-Length:]]]] [[ヘッダー]]に入れて[[要求]]を繰り返して構いません [SRC[>>416]]。

* 歴史

[FIG(quote)[
[FIGCAPTION[
[414] RFC 2068 & 2616 (HTTP/1.1) 10.4.12 411 Length Required
]FIGCAPTION]

> The server refuses to accept the request without a defined Content-Length. The client MAY repeat the request if it adds a valid
Content-Length header field containing the length of the message-body
in the request message.

サーバーは、 [CODE(HTTP)[[[Content-Length]]]] が定義されていない要求を受け入れるのを拒否します。
クライアントは、要求メッセージ中の [CODE(ABNF)[[[message-body]]]]
の長さを含んだ妥当な [CODE(HTTP)[Content-Length]] 頭欄を加えれば要求を繰り返しても'''構いません'''。
]FIG]


[FIG(quote)[
[FIGCAPTION[
[1] [CITE[Bitbucket API]]
([TIME[2017-09-08 17:02:11 +09:00]])
<https://developer.atlassian.com/bitbucket/api/2/reference/meta/uri-uuid>
]FIGCAPTION]

> You can get a 411 Length Required response. If this happens, the API requires a Content-Length header but the client is not sending it.

]FIG]
