簡単にHTTP/2通信を試すブログ簡単にHTTP/2通信を試す仕事でちょっとHTTP/2通信のフレームの内容を確認する必要があったのでツールを作りました。curlやブラウザ組み込みの開発ツールでは、HTTP/2で通信してもHTTP/1.1レベルの情報しか表示してくれず、HTTP/2のフレームレベルの確認はできません。Wiresharkでキャプチャしてもいいのですが、送信データを少しいじって試したかったので、今回簡単なものを作りました。https://github.com/kztomita/http-dumpシェル上で実行するコマンドで、指定URLにHTTP/2でGETリクエストを送信し、レスポンスを受信するまでのHTTPフレームのやりとりを出力します(詳細はリンク先のREADMEを参照)。https://github.co.jp/実行結果例HTTP/2で通信できれば以下のように送受信したフレームの内容が表示されます。Y.I/.T.*d..Y>......略...HEADERSフレーム受信後はHPACK形式のデータを解析してHTTPヘッダーを取得する。Tableの内容をダンプ。GMT...略...最後に取得したレスポンスボディを出力HTTP/1.1の頃はテキストデータのやりとりだったので、telnet等で簡単にリクエストを送信して内容を確認したりできたのですが、HTTP/2になって転送形式がバイナリになったり、TLSが必要になったりで手軽にリクエスト送信して内容を確認することができなくなってしまいました。勉強のためにもHTTP/1.1やSMTPのように簡単に試せるというのは結構重要だと思うんですよね。以前からHTTP/2の通信を簡単に試せるツールが欲しいと思っていたので今回作成しました。機能自体は少ないので、送信するHTTPヘッダーを変更したい場合などはソースコードを直接修正する必要があります。HTTP/2の通信手順はh2.ccをみればだいたいわかると思います。GETリクエストを送信してレスポンスを受け取るだけならSETTINGS,HEADERS,DATA,GOAWAYの4種類のフレームをやりとりするだけですみます。送信するSETTINGSフレームの内容やHTTPヘッダーを変えたい場合もh2.ccを修正すれば対応できます。実際に実装して面倒だったのが、HTTPヘッダーのやり取り。Tableの管理が必要だったりとそれなりにやることが多いです。このあたりもHTTP/2通信の中身をちょっと覗いてみたいという人にとっては壁になるのではないかと思います。レスポンスを取得するだけなら、HEADERSフレームの中身は無視してしまってもいいのですが、今回はHPACKのデコード処理はそれなりに真面目に実装しました。Tableの更新はあまり意味がありませんが。HPACK関連の処理はhpack_*.ccのファイルにあります。現状、HTTP/2通信を試してみるレベルのものなので、ストリームも一つしか使っていませんし、ストリームの状態管理のようなことも行っていません。ERRORを返すべきところでもそのまま終了しています。作っていたらいろいろおもしろくなってきたので、時間があれば複数ストリームを使った通信やPRIORITYまわりもいじれるようにしてみたいと思います。(1)技術的な情報は以下にもあります。