HTTP/2 Frame test case の使い方
これは HTTP2 Advent Calendar 2014の4日目の記事です。
日本のHTTP/2 コミュニティでは、相互接続性を検証するためにHPACK test caseを作成し、好評を得ました。現在は、Frame test caseの作成に取り組んでいます。この記事では、Frame test caseの使い方について説明します。
正常系
現時点では、JSONフォーマットが確定していません。テストケースは、山本がとりあえず作ったものを個人のリポジトリに置いています。この記事がきっかけとなって、フォーマットの議論や他のテストケースの作成が進むと嬉しいです。
たとえば、正常なデータフレームは、こんな感じです。
{ "error": null, "wire": "0000140008000000020648656C6C6F2C20776F726C6421486F77647921", "frame": { "length": 20, "frame_payload": { "data": "Hello, world!", "padding_length": 6, "padding": "Howdy!" }, "flags": 8, "stream_identifier": 2, "type": 0 }, "draft": 14, "description": "normal data frame" }
"error" が null なので、正常だと分かります。"wire"がネットワーク上に流れるフレームであり、16進数表記になっています。まず、"wire"データをパースして、"frame"と一致するか確かめましょう。もちろん、"frame" というJSONオブジェクトをあなたのコードで使われているデータ表現に変える必要がありますよ。
これは、正常なデータですので、逆も確かめます。すなわち、"frame"からフレームをビルドして、"wire" と一致しているか確かめます。
異常系
たとえば、異常なフレームはこんな感じです。
{ "error": [ 6 ], "wire": "0080000008000000020648656C6C6F2C20776F726C6421686F77647921", "frame": null, "draft": 14, "description": "data frame with frame size error" }
これは "error" が null でないので、異常なフレームだと分かります。"error" には、可能性のあるエラーコードが(もれていなければ)すべて含まれています。"wire" 部分をパースし、返って来たエラーコードが "error" の中にあるか確かめましょう。
今後の課題
- みんなで使ってみて JSON フォーマットを確定させましょう
- みんなでテストケースを増やしましょう
- それらをhpack-test-caseにマージしましょう
おまけ
なお、余談ですが、現在の仕様では "HTTP2.0" ではなく "HTTP/2" もしくは "HTTP2" が正しい名称です。