Skip to content

Instantly share code, notes, and snippets.

@summerwind
Last active August 29, 2015 14:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save summerwind/e7d30eedbd1d02857a49 to your computer and use it in GitHub Desktop.
Save summerwind/e7d30eedbd1d02857a49 to your computer and use it in GitHub Desktop.
HTTP/2 extension for HTTP Archive (HAR) 1.2

HTTP/2 extension for HTTP Archive (HAR)

目的

パフォーマンス情報の出力に広く使われている HTTP Archive (HAR) 形式を独自に拡張し、HTTP/2 フレーミングレイヤーの情報を追加できる拡張仕様を検討する。

これは、HTTP/2 ではパフォーマンス面での改善を目的とした様々な機能が盛り込まれているが、既存のブラウザにおいては HTTP/2 のフレーミングレイヤーの情報 (例: HTTP/2 フレームや優先度情報) を取得できないため、パフォーマンスチューニングが難しくなっているためである。

拡張

log の拡張

HAR のログ全体を格納する log オブジェクトに、フレームが送受信されたタイミングやその内容を示す _h2Frames キーを追加する。このキーの値には frame オブジェクトの配列が含まれる。

{
  "log": {
    ...,
    "_h2Frames": [
      {
        "connection": "52492",
        "time": "2015-06-20T13:39:59.638+00:00",
        "peer": false,
        "header": {
          "legnth": 64,
          "type": "HEADERS",
          "flags": [
          	"END_STREAM",
          	"END_HEADERS"
          ],
          "streamId": 1
        },
        "payload": {
        	"weight": 255
        }
      },
      {
        "connection": "52492",
        "time": "2015-06-20T13:39:59.890+00:00",
        "peer": true,
        "header": {
          "legnth": 32,
          "type": "HEADERS",
          "flags": [
          	"END_HEADERS"
          ],
          "streamId": 1
        },
        "payload": {}     
      },
      {
        "connection": "52492",
        "time": "2015-06-20T13:39:59.972+00:00",
        "peer": true,
        "header": {
          "legnth": 1664,
          "type": "DATA",
          "flags": [
          	"END_STREAM"
          ],
          "streamId": 1
        },
        "payload": {}     
      }
    ]
  }  
}

frame オブジェクト

frame オブジェクトは、HTTP/2 のフレーミングレイヤーで送受信されたフレームの情報を示すものであり、以下のキーを含む。

キー キーの省略
connection HTTP/2 コネクションを識別するための文字列。entries オブジェクトに含まれる connection と値が一致する必要がある。 String 52492 不可
time フレームが送受信された時間を示すタイムスタンプ。フォーマットは ISO 8601 (YYYY-MM-DDThh:mm:ss.sTZD) を使用する。 String 2015-06-20T13:39:59.890+00:00 不可
peer フレームを送信したのが通信相手であるかどうかを示すフラグ。true であれば、相手が送信したフレームになる。 Boolean true 不可
header HTTP/2 フレームのヘッダー情報を含むオブジェクト。 Object - 不可
payload HTTP/2 フレームのペイロード情報を含むオブジェクト。フレームの種類により中身は異なる。 Object - 不可

header オブジェクト

frame オブジェクトに含まれる header オブジェクトは、HTTP/2 フレームのヘッダー情報を示すものであり、以下のキーを含む。

キー キーの省略
length フレームの長さ。 Number 64  不可
type フレームの種類を文字列で表現したもの。 String HEADERS 不可
flags フレームに付与されたフラグを文字列で表現したものの値。 String Array [ "END_STREAM", "END_HEADERS", "PRIORITY" ] 不可
streamId フレームが送信されたストリーム ID。 Number 1 不可

payload オブジェクト

frame オブジェクトに含まれる payload オブジェクトは、HTTP/2 フレームのペイロード情報を示すものである。オブジェクトの中身は、以下のようにフレームの種類により異なる。

DATA

キー キーの省略
padLength パディングフィールドの長さ。 Number 8

HEADERS

キー キーの省略
padLength パディングフィールドの長さ。 Number 8
streamDependency 優先度情報の依存先ストリーム ID。 Number 5
weight 優先度情報の重み。 Number 16

PRIORITY

キー キーの省略
exclusive 優先度情報の exclusive フラグ。 Boolean true 不可
streamDependency 優先度情報の依存先ストリーム ID。 Number 5 不可
weight 優先度情報の重み。 Number 16 不可

RST_STREAM

キー キーの省略
errorCode エラーコードを文字列で表現したもの。 String PROTOCOL_ERROR 不可

SETTINGS

キー キーの省略
settings setting オブジェクトの配列。 Object Array - 不可

PUSH_PROMISE

キー キーの省略
padLength パディングフィールドの長さ。 Number 8
promisedStreamId 予約ストリーム ID。 Number 13 不可

PING

キー キーの省略
opaqueDataLength Opaque Dataの長さ。 Number 1 不可

GOAWAY

キー キーの省略
lastStreamID 最後に処理したストリーム ID。 Number 9 不可
errorCode エラーコードを文字列で表現したもの。 String PROTOCOL_ERROR 不可
debugDataLength デバッグデータの長さ。 Number 1 不可

WINDOW_UPDATE

キー キーの省略
windowSizeIncrement ウインドウサイズの増加量 Number 100 不可

CONTINUATION

payload オブジェクトの中身は常に空になる。

setting オブジェクト

SETTINGS フレームの payload オブジェクトに含まれる setting オブジェクトは、HTTP/2 設定情報を示すものである。

キー キーの省略
identifier 設定識別子。 String SETTINGS_MAX_CONCURRENT_STREAMS 不可
value 設定値。 Number 100 不可

entries の拡張

リクエストとレスポンスが、HTTP/2 のどのストリーム ID で処理されたかを識別可能にするため、entries オブジェクトに、HTTP/2 のストリーム ID を追加する。

{
  "log": {
    ...,
    "entries": [
      {
        ...,
        "_h2StreamId": 1
      }
    ]
  }  
}

新たに追加するキーの情報は以下の通り。

キー キーの省略
_h2StreamId entries オブジェクトに紐付くリソースが転送されたストリームの ID。 Number 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment