SummerWind

Web, Photography, Space Development

h2spec で HTTP/2 サーバーをテストする

これは HTTP2 Advent Calendar の5日目の記事です。

先日、HTTP/2 の16番目のドラフトが公開され、いよいよ HTTP/2 の仕様策定も終わりが見えてきました。仕様の策定が進むに伴い、各種言語で実装されたサーバーやクライアントも増えています。自分も Node.js を使って実験用の HTTP/2 サーバーである「Sasazka」を実装したりしているのですが、HTTP/2 を実装する上でなかなか大変になるのが、フレームやストリーム、HPACK の圧縮コンテキストに関連する処理や、それに伴って発生するエラーの処理です。

HTTP/2 のドラフトには、各種フレームやストリームの処理の仕組みとそれに関連するエラーの処理が細かく記載されていますが、仕様そのものは HTTP/1.x よりが複雑になっているため、全てを実装して、それをテストのはなかなか大変な作業です。他の言語の実装を参考にしてテストを移植する、という方法もありますが、ライブラリのインターフェースが異なっていたりして、そう簡単には移植できないことも多いかと思います。

前置きが長くなってしまいましたが、HTTP/2 の実装テストに関するこういった問題を解決するために、h2spec というツールを作っています。これは指定したサーバーに HTTP/2 の仕様に基づいたフレームのパターンを送信して、それに対するサーバーの振る舞いが仕様にあっているかどうかをテストするものです。テストの実行はコマンドに対象サーバーのホスト名とポートを指定しておこないます。以下は localhost の 8888 ポートに対して実行する例です。

$ h2spec -h localhost -p 8888

h2spec を実行すると、以下のように rspec 風のテスト結果が表示されます。仕様の振る舞いと異なっているテストについては、赤字で表示されます。

h2spec

実は開発を始めた時は、Sasazka を使って Node.js で実装していたのですが、そろそろ真面目に Go の勉強がしたかったのと、Go のポータビリティが魅力的だったので、現在は Go で書き直しているところです。そういった関係で現時点では HEADERS フレーム (仕様書の6.2節) のテストケースまでしか含まれていませんが、順次テストケースを増やしていく予定です。

h2spec の最新バイナリは GitHub からダウンロードできます (Linux、Windows 向けバイナリは次のバージョンで公開予定です)。HTTP/2 サーバーを実装している、という方は、開発のお供にぜひ。

最後に余談になりますが、現在の仕様では “HTTP/2.0” や “HTTP2.0” といった表記は正しくありません。正しくは “HTTP/2” または “HTTP2” となります。

Moto Ishizawa

Moto Ishizawa
ソフトウェアエンジニア。ロケットの打上げを見学するために、たびたびフロリダや種子島にでかけるなど、宇宙開発分野のファンでもある。