parse a header value

欄値 (HTTP)

[1] 欄値 (field body) は、ヘッダーの値です。

仕様書

構文

[3] 欄値は、零文字以上の VCHARSPHTAB の列とされています >>2, >>14

[4] SPHTAB は最初や最後にはできません >>2。 ただし実際にはヘッダー内で欄値の前後に OWS が認められていますから、見かけ上はこの制約は無いともいえます。

[11] RFC 7233Content-Range: ヘッダーの定義はこの制約に反しています。 RFC 7235challengecredentials もこの制約に反した値を受理してしまいます。
  1. ?
    1. VCHAR
    2. ?
      1. *
        1. |
          1. VCHAR
          2. SP
          3. HTAB
      2. VCHAR

[5] 廃止された (生成してはいけない) 構文として、 >>3 に加えて obs-text が含まれることがあります。また、 行折り畳みが行われることがあります。 >>2

文字コード

[7] 歴史的には文字コードISO-8859-1 とされていましたが、 RFC 7230 は実際にはほとんど US-ASCII しか使われていないと述べています >>6

[8] 新しいヘッダーは、欄値US-ASCII に限定するべきです >>6

[9] 受信者は、欄値非ASCII文字 (obs-text) を不透明なデータとして扱うべきです >>6

[10] 歴史的には、非標準のヘッダーを中心に、非ASCII文字がしばしば用いられていました。

[29] RFC 1945 は明確な規定をしていませんでした。

[30] RFC 2068RFC 2616ISO-8859-1 としていました。

[31] RFC 723x になって US-ASCII + 不透明という現在の規定になりました。

[28] 近年では UTF-8 がよく用いられています。

[32] Set-Cookie2: ヘッダーComment 属性UTF-8 と規定していました。

[33] realm では本体と同じ文字コードなどが使われてきました。

[34] Content-Disposition:filename でも色々な文字コードが使われてきました。

[35] 過去の HTTPRFC の中には encoded-word が使えるとするものがありましたが、 まったく現実と乖離した規定でした。

長さ制限

[47] 構文上はヘッダー値の最大長はありません。

[48] Webブラウザーが送出する Referer: ヘッダー値は、 セキュリティー上の理由で 4096 バイト (4KB) 以下に制限されています。 Referer:

処理

[102] 構文上認められないヘッダー値を含む HTTP/2 メッセージは、 奇形です >>101

[13] 具体的には 0x00-0x08, 0x0D, 0x0C, 0x0E-0x1F, 0x7F が含まれる場合や、 先頭や末尾に 0x20, 0x09, 0x0A, 0x0D がある場合、 0x0D 0x0A の後に 0x09 または 0x0A という形以外で 0x0D, 0x0A が含まれる場合が該当するとみられます。 0x80-0xFF は該当しません。

[17] 実際には FirefoxChrome も、ヘッダー値がどんなバイト列でも奇形とはしないようです。 Chrome は先頭と末尾の 0x09, 0x20 を削除します。 Firefox は先頭と末尾の 0x09, 0x20, 0x0A, 0x0D を削除し、 それ以外の 0x0D、0x0A を 0x20 に置換します。

比較

[12] Vary: ヘッダーで指定されたヘッダーの値の比較方法が HTTP で規定されています。

Vary: の項を参照。

歴史

[15] Reference the new HTTP RFCs. Normalize header values. Fixes #99, #100… · whatwg/fetch@6c00fe2 ( 版) https://github.com/whatwg/fetch/commit/6c00fe28e7a361d2b7e0dda776ebccfaa4c439a5

[16] Make setRequestHeader() normalize header values just like Fetch does … · whatwg/xhr@90c79d0 ( 版) https://github.com/whatwg/xhr/commit/90c79d0c0a5dff16266c4b6673eca8bb512343f6

[18] 1197847 – dont allow line folding in h2 headers ( 版) https://bugzilla.mozilla.org/show_bug.cgi?id=1197847

[19] Editorial: point out the header value syntax issue (annevk著, ) https://github.com/whatwg/fetch/commit/d465c84d35e86911b00ef2722295184c8a71b420

[20] Define header value inline (annevk著, ) https://github.com/whatwg/fetch/commit/34f586dae28d4678518b4d07b29deec227815f26

[21] Stop lowercasing header names (annevk著, ) https://github.com/whatwg/fetch/commit/5869c43a27fff06c6dfc228fe1288018f7f2168d

[22] Breaking: redo value parsing as value extraction (annevk著, ) https://github.com/whatwg/fetch/commit/68a986772901fe74f666f76a389dbc56cac1ad21

[23] Editorial: use new extracting header list values hook from Fetch (#99) (annevk著, ) https://github.com/w3c/webappsec-referrer-policy/commit/72c085bb5949bbd2525ff97aefdebb22be0e62ba

[24] JSONヘッダー値

[25] 942074 - javascript method XMLHttpRequest.setRequestHeader(...) is no longer perform URL encoding () https://bugzilla.mozilla.org/show_bug.cgi?id=942074

[26] [EventSource] Is Last-Event-ID header value allowed to contain any-char? · Issue #689 · whatwg/html () https://github.com/whatwg/html/issues/689

[27] Accept-CH-Lifetime privacy concerns · Issue #372 · httpwg/http-extensions () https://github.com/httpwg/http-extensions/issues/372

[36] Listing headers safe only for certain values is a bad idea · Issue #313 · whatwg/fetch () https://github.com/whatwg/fetch/issues/313

[37] Strengthen requirements on CORS-safelisted request-headers (annevk著, ) https://github.com/whatwg/fetch/commit/9288c8f85c809a0ac371be6843ad2cf4046ee35b

[38] CORS-safelisted request headers should be restricted according to RFC 7231 · Issue #382 · whatwg/fetch () https://github.com/whatwg/fetch/issues/382

[39] Define parsing for X-Content-Type-Options: nosniff in detail (annevk著, ) https://github.com/whatwg/fetch/commit/32c7b1c76a43ea96b8663628b891b339553ae114

[40] Define parsing for X-Content-Type-Options in detail by annevk · Pull Request #818 · whatwg/fetch () https://github.com/whatwg/fetch/pull/818

[41] Be strict on request's Content-Type (annevk著, ) https://github.com/whatwg/fetch/commit/e06e2613f9eef720d0df8640be793efca2af89bc

[42] Redesign "extract header values" and "extract header list values" · Issue #814 · whatwg/fetch () https://github.com/whatwg/fetch/issues/814

[43] Be strict on request's Content-Type by annevk · Pull Request #829 · whatwg/fetch () https://github.com/whatwg/fetch/pull/829

[44] "Extract a MIME type" algorithm should pick the first entry? · Issue #529 · whatwg/fetch () https://github.com/whatwg/fetch/issues/529

[45] Define the Content-Type header parser by annevk · Pull Request #831 · whatwg/fetch () https://github.com/whatwg/fetch/pull/831

[46] Escaped string and backslash not web compatible · Issue #161 · WICG/ua-client-hints () https://github.com/WICG/ua-client-hints/issues/161