[1] [DFN[[RUBYB[[[欄値]]]@en[field body]]]]は、[[ヘッダー]]の値です。

* 仕様書

[REFS[
- [2] [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#page-23>
- [6] [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#page-26>
- [14] [CITE[RFC Errata Report]] ([TIME[2015-08-11 11:46:28 +09:00]] 版) <https://www.rfc-editor.org/errata_search.php?rfc=7230&eid=4189>
- [101] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-10.3>
]REFS]

* 構文

[3] [[欄値]]は、零文字以上の [[VCHAR]] や [[SP]] や [[HTAB]] の列とされています [SRC[>>2, >>14]]。

[4] [[SP]] や [[HTAB]] は最初や最後にはできません [SRC[>>2]]。
ただし実際には[[ヘッダー]]内で[[欄値]]の前後に
[[OWS]] が認められていますから、見かけ上はこの制約は無いともいえます。

;; [11] [[RFC 7233]] の [CODE(HTTP)@en[[[Content-Range:]]]] [[ヘッダー]]の定義はこの制約に反しています。
[[RFC 7235]] の [[challenge]] や [[credentials]] もこの制約に反した値を[[受理]]してしまいます。

[FIG(railroad)[
= ?
== [[VCHAR]]
== ?
=== *
==== |
===== [[VCHAR]]
===== [[SP]]
===== [[HTAB]]
=== [[VCHAR]]
]FIG]

[5] [[廃止]]された ([[生成]]してはいけない) 構文として、
>>3 に加えて [[obs-text]] が含まれることがあります。また、
[[行折り畳み]]が行われることがあります。 [SRC[>>2]]

** 文字コード

[7] 歴史的には[[文字コード]]は [[ISO-8859-1]] とされていましたが、 [[RFC 7230]]
は実際にはほとんど [[US-ASCII]] しか使われていないと述べています [SRC[>>6]]。

[8] 新しい[[ヘッダー]]は、[[欄値]]を [[US-ASCII]] に限定する[['''べきです''']] [SRC[>>6]]。 

[9] [[受信者]]は、[[欄値]]の[[非ASCII文字]] ([[obs-text]]) を不透明なデータとして扱う[['''べきです''']]
[SRC[>>6]]。

[HISTORY[
[10] 歴史的には、非標準のヘッダーを中心に、[[非ASCII文字]]がしばしば用いられていました。

[29] [[RFC 1945]] は明確な規定をしていませんでした。

[30] [[RFC 2068]] や [[RFC 2616]] は [[ISO-8859-1]] としていました。

[31] [[RFC 723[VAR[x]]]] になって [[US-ASCII]] + 不透明という現在の規定になりました。

[28] 近年では [[UTF-8]] がよく用いられています。

[32] [CODE[Set-Cookie2:]] [[ヘッダー]]の [CODE[Comment][Comment=""]] [[属性]]は
[[UTF-8]] と規定していました。

[33] [CODE[realm][realm=""]] では[[本体]]と同じ[[文字コード]]などが使われてきました。

[34] [CODE[Content-Disposition:]] の [CODE[filename][filename=""]]
でも色々な[[文字コード]]が使われてきました。

[35] 過去の [[HTTP]] の [[RFC]] の中には [[encoded-word]] が使えるとするものがありましたが、
まったく現実と乖離した規定でした。

]HISTORY]

** 長さ制限

[47] 
構文上は[[ヘッダー値]]の最大長はありません。

[48] 
[[Webブラウザー]]が送出する [CODE[Referer:]] [[ヘッダー値]]は、
[[セキュリティー]]上の理由で
[N[4096]] [[バイト]] (4KB) [[以下]]に制限されています。
[SEE[ [[Referer:]] ]]

* 処理

[102] 構文上認められない[[ヘッダー値]]を含む [[HTTP/2]] [[メッセージ]]は、
[[奇形]]です [SRC[>>101]]。

[13] 具体的には [CODE[0x00]]-[CODE[0x08]], [CODE[0x0D]], [CODE[0x0C]], 
[CODE[0x0E]]-[CODE[0x1F]], [CODE[0x7F]] が含まれる場合や、
先頭や末尾に [CODE[0x20]], [CODE[0x09]], [CODE[0x0A]], [CODE[0x0D]] がある場合、
[CODE[0x0D]] [CODE[0x0A]] の後に [CODE[0x09]] または [CODE[0x0A]]
という形以外で [CODE[0x0D]], [CODE[0x0A]] が含まれる場合が該当するとみられます。
[CODE[0x80]]-[CODE[0xFF]] は該当しません。

[17] 実際には [[Firefox]] も [[Chrome]] も、[[ヘッダー値]]がどんな[[バイト列]]でも[[奇形]]とはしないようです。
[[Chrome]] は先頭と末尾の 0x09, 0x20 を削除します。
[[Firefox]] は先頭と末尾の 0x09, 0x20, 0x0A, 0x0D を削除し、
それ以外の 0x0D、0x0A を 0x20 に置換します。
[TIME[2015-10-10T15:18:31.200Z]]

* 比較

[12] [CODE(HTTP)@en[[[Vary:]]]] [[ヘッダー]]で指定された[[ヘッダー]]の値の比較方法が
[[HTTP]] で規定されています。

;; [CODE(HTTP)@en[[[Vary:]]]] の項を参照。

* 歴史

[15] [CITE@en[Reference the new HTTP RFCs. Normalize header values. Fixes #99, #100… · whatwg/fetch@6c00fe2]]
([TIME[2015-08-11 11:49:37 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/6c00fe28e7a361d2b7e0dda776ebccfaa4c439a5>

[16] [CITE@en[Make setRequestHeader() normalize header values just like Fetch does … · whatwg/xhr@90c79d0]]
([TIME[2015-08-11 11:49:54 +09:00]] 版)
<https://github.com/whatwg/xhr/commit/90c79d0c0a5dff16266c4b6673eca8bb512343f6>

[18] [CITE@en[1197847 – dont allow line folding in h2 headers]]
([TIME[2015-11-06 18:08:11 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=1197847>

[19] [CITE@en[Editorial: point out the header value syntax issue]]
([[annevk]]著, [TIME[2016-08-12 19:35:16 +09:00]])
<https://github.com/whatwg/fetch/commit/d465c84d35e86911b00ef2722295184c8a71b420>

[20] [CITE@en[Define header value inline]]
([[annevk]]著, [TIME[2017-01-12 17:40:25 +09:00]])
<https://github.com/whatwg/fetch/commit/34f586dae28d4678518b4d07b29deec227815f26>

[21] [CITE@en[Stop lowercasing header names]]
([[annevk]]著, [TIME[2017-02-22 20:01:22 +09:00]])
<https://github.com/whatwg/fetch/commit/5869c43a27fff06c6dfc228fe1288018f7f2168d>

[22] [CITE@en[Breaking: redo value parsing as value extraction]]
([[annevk]]著, [TIME[2017-02-22 23:42:59 +09:00]])
<https://github.com/whatwg/fetch/commit/68a986772901fe74f666f76a389dbc56cac1ad21>

[23] [CITE@en[Editorial: use new extracting header list values hook from Fetch (#99)]]
([[annevk]]著, [TIME[2017-03-03 08:07:08 +09:00]])
<https://github.com/w3c/webappsec-referrer-policy/commit/72c085bb5949bbd2525ff97aefdebb22be0e62ba>

[24] [[JSONヘッダー値]]

[25] [CITE@en[942074 - javascript method XMLHttpRequest.setRequestHeader(...) is no longer perform URL encoding]]
([TIME[2017-05-14 15:42:31 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=942074>

[26] [CITE@en['''['''EventSource''']''' Is Last-Event-ID header value allowed to contain any-char? · Issue #689 · whatwg/html]]
([TIME[2017-08-04 13:51:38 +09:00]])
<https://github.com/whatwg/html/issues/689>

[27] [CITE@en[Accept-CH-Lifetime privacy concerns · Issue #372 · httpwg/http-extensions]]
([TIME[2017-10-19 17:48:38 +09:00]])
<https://github.com/httpwg/http-extensions/issues/372>

[36] [CITE@en[Listing headers safe only for certain values is a bad idea · Issue #313 · whatwg/fetch]]
([TIME[2018-08-22 19:14:01 +09:00]])
<https://github.com/whatwg/fetch/issues/313>

[37] [CITE@en[Strengthen requirements on CORS-safelisted request-headers]]
([[annevk]]著, [TIME[2018-05-25 18:19:35 +09:00]])
<https://github.com/whatwg/fetch/commit/9288c8f85c809a0ac371be6843ad2cf4046ee35b>

[38] [CITE@en[CORS-safelisted request headers should be restricted according to RFC 7231 · Issue #382 · whatwg/fetch]]
([TIME[2018-08-22 19:29:08 +09:00]])
<https://github.com/whatwg/fetch/issues/382>

[39] [CITE@en[Define parsing for X-Content-Type-Options: nosniff in detail]]
([[annevk]]著, [TIME[2018-11-01 18:14:30 +09:00]])
<https://github.com/whatwg/fetch/commit/32c7b1c76a43ea96b8663628b891b339553ae114>

[40] [CITE@en[Define parsing for X-Content-Type-Options in detail by annevk · Pull Request #818 · whatwg/fetch]]
([TIME[2019-03-04 19:58:37 +09:00]])
<https://github.com/whatwg/fetch/pull/818>

[41] [CITE@en[Be strict on request's Content-Type]]
([[annevk]]著, [TIME[2018-11-09 17:36:06 +09:00]])
<https://github.com/whatwg/fetch/commit/e06e2613f9eef720d0df8640be793efca2af89bc>

[42] [CITE@en[Redesign "extract header values" and "extract header list values" · Issue #814 · whatwg/fetch]]
([TIME[2019-06-19 13:54:40 +09:00]])
<https://github.com/whatwg/fetch/issues/814>

[43] [CITE@en[Be strict on request's Content-Type by annevk · Pull Request #829 · whatwg/fetch]]
([TIME[2019-06-19 13:56:03 +09:00]])
<https://github.com/whatwg/fetch/pull/829>

[44] [CITE@en["Extract a MIME type" algorithm should pick the first entry? · Issue #529 · whatwg/fetch]]
([TIME[2019-06-19 15:02:59 +09:00]])
<https://github.com/whatwg/fetch/issues/529>

[45] [CITE@en[Define the Content-Type header parser by annevk · Pull Request #831 · whatwg/fetch]]
([TIME[2019-06-19 15:08:51 +09:00]])
<https://github.com/whatwg/fetch/pull/831>

[46] [CITE@en[Escaped string and backslash not web compatible · Issue #161 · WICG/ua-client-hints]]
([TIME[2021-02-10T08:19:49.000Z]])
<https://github.com/WICG/ua-client-hints/issues/161>