HTTPヘッダに構造定義を与える Structured Headers の提案仕様 (draft-00)

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(アジェンダ)でも議論される予定です。


以下では定義されている構造について羅列していきます。仕様ではシンタックスとパース方法も書かれていますが割愛

Numbers

整数。IEEE 754倍精度少数。

ExampleNumberHeader: 4.5

パース及び、精度については議論有り。

Strings

ASCII文字列

ExampleStringHeader: "hello world"
Labels

ラベル(小文字のみ)

ExampleLabelHeader: foo/bar
Parameterised Labels

パラメータ付きラベル(順番に意味はない)

ExampleParamHeader: abc; a=1; b=2; c
Binary Content

バイナリデータ(Base64エンコード)

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