あどけない話

Internet technologies

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" が正しい名称です。