2019/12/17追記 draft-14ベースで記事を書き直しました。
(また、最新仕様では 名称が "Structured Field Values for HTTP" に変更されました)
asnokaze.hatenablog.com
以下は古い記事です。
HTTPヘッダには、リストや辞書といった構造を表現するのに決まったやり方はありません。
HTTPヘッダ毎にシンタックスや構造が定義されており、そのためパーサーが再利用出来ません。
mnot氏とphk氏の共著で提出された「Structured Headers for HTTP」仕様では、HTTPヘッダに下記の構造を定義しパーサを再利用できるようします。また、新しいHTTPヘッダを標準化する際も個々別のシンタックス定義を不要にしています。
- Numbers
- Strings
- Labels
- Parameterised Labels
- Binary Content
- Items
- Dictionaries
- Lists
この仕様はすでに定義されているヘッダを再定義するものではなく、この定義を使用して定義されるヘッダにて使用される想定です
Structured Headers for HTTP
JSON形式を用いるものや、新しい構造を定義して、HTTPヘッダに構造を与える提案仕様は過去にも有りました(IETF97議事録参照)。しかし、どちらも標準化には至っていません。
上記の議論を踏まえて出てきたのが、「Structured Headers for HTTP」という仕様です。
以前の2つに比べ、既存のHTTPの形式に近しい印象です。今月実施される、IETF100(アジェンダ)でも議論される予定です。
以下では定義されている構造について羅列していきます。仕様ではシンタックスとパース方法も書かれていますが割愛
Strings
ASCII文字列
ExampleStringHeader: "hello world"
Labels
ラベル(小文字のみ)
ExampleLabelHeader: foo/bar
Parameterised Labels
パラメータ付きラベル(順番に意味はない)
ExampleParamHeader: abc; a=1; b=2; c
Binary Content
ExampleBinaryHeader: *cHJldGVuZCB0aGlzIGlzIGJpbmFyeSBjb250ZW50Lg
Items
number、string、label、binaryのいずれか
Dictionaries
辞書データ(LabelとItemの組からなる)
ExampleDictHeader: foo=1.23, da="Applepie", en=*w4ZibGV0w6ZydGUK
Lists
Itemのリスト(配列)
ExampleLabelListHeader: foo, bar, baz_45