Protobuf
Proxyman で .desc ファイルディスクリプタと Message Type ルールを使い、Protobuf の HTTP/HTTPS リクエスト、レスポンス、WebSocket メッセージをデコードします。
1. 概要
- Proxyman macOS では、指定した desc ファイルを使って、HTTP/HTTPS リクエストとレスポンスの Protobuf ボディをデコードできます
- Protobuf のバイナリをデコードし、プレーンテキストとして表示します
- 1 つの Protobuf バイナリ内の Single Message と、複数の Delimited Messages に対応しています
- desc ファイルをインポートすると、そこに含まれるすべての Message Type を読み込み、Protobuf バイナリをデコードできます
- WebSocket の Protobuf をデコード
2. Protobuf ファイルディスクリプタ(*.desc)
Proxyman で Protobuf データを正しく解析するには、ファイルディスクリプタ(*.desc)が必要です。
ファイルディスクリプタを入手する方法はいくつかあります。
1. 同僚に聞く
社内で Protobuf を使っている場合、特にバックエンドチームとフロントエンドチームであれば、同僚がすでにこのファイルを持っている可能性が高いです。
ディスクリプタファイルは 1 つの場合も、複数の場合もあります。
2. *.proto ファイルから生成
*.proto ファイルが多数ある場合は、次のコマンドで 1 つの *.desc ファイルを生成できます。
# Install protobuf cli if need
brew install protobuf
# Create `input` folder on the Desktop
# Copy all proto files to the `input` folder
# Generate 1 descriptor file with multiple proto files
protoc --descriptor_set_out=output.desc --include_imports -I=/Users/<your_name>/Desktop/input /Users/<your_name>/Desktop/input/*.proto
# Done
# output.desc
ディスクリプタファイルを用意したら、Proxyman にインポートします。
- Tools メニュー -> Protobuf… を開き、Protobuf Schema... ボタンをクリックします。
- + ボタンをクリックし、output.desc ファイルを選択します。
Proxyman 3.6.0 以降では、より正確な Protobuf 解析のために ファイルディスクリプタ(*.desc) のみを受け付けます。
*.proto ファイルがある場合は、*.desc に変換できます。上の *.proto ファイルから生成 を参照してください。
Proxyman は、Timestamp、Struct、Value、Enum、Method など、Google Protobuf の一般的な型を自動的にインポートします。
Proxyman は proto2 と proto3 の両方の構文に対応しています。詳しくはこちら
3. Protobuf の設定
Protobuf を使う前に、Proxyman が Protobuf データの解析に使用する Message Type を設定する必要があります。
次の表で各設定を説明します。
| 名前 | 説明 |
|---|---|
| Schema | 必要に応じて .desc ファイルを追加します |
| Message Type | Protobuf バイナリ内のルートオブジェクトのクラス名。パッケージ名を含める必要があります |
| Payload Type: Auto | Protobuf バイナリが Single Message か Delimited Message のどちらでエンコードされているかを自動判定します |
| Payload Type: Single Message | Protobuf バイナリ内の Single Message |
| Payload Type: Delimited List | Protobuf バイナリ内の複数のメッセージ(長さプレフィックス付き) |

Proxyman で Protobuf の HTTPS レスポンスをデコード
4. 使い方
Protobuf の名前付きフィールドを正しく解析する方法は 2 つ あります:
- Protobuf ルールを定義する
- Content-Type ヘッダーから読み取る
4.1 Protobuf ルールを定義する
- Protobuf リクエストには Content-Type ヘッダーが必要です:
Content-Type: application/x-protobufまたはContent-Type: application/protobuf - Proxyman は Protobuf ペイロードを検出すると、Message Type が指定されていないため正しく解析できないという警告を表示します。Add をクリックして Protobuf Settings を開いてください。
または、リクエストを右クリックして Tools -> Protobuf… を選択することもできます。
3. Protobuf ルールのウィンドウで、このリクエスト/レスポンスの Message Type を選択します(必要に応じて desc ファイルを追加してください)。
リクエストとレスポンスで異なる Protobuf Message Type を使用している場合は、`Use different Message Type for Request / Response` チェックボックスをオンにしてください。
4. Add をクリックすると、ボディが JSON 形式で表示されます。
4.2 Content-Type ヘッダーから読み取る
Content-Type から Protobuf の設定を 動的に 指定できます。
例えば、リクエストまたはレスポンスの Content-Type は次のような値になります。
Content-Type: application/x-protobuf; messageType="tutorial.Address"; delimited=true
Content-Type: application/x-protobuf; messageType="com.proxyman.User"; delimited=false
これにより、Proxyman は Protobuf ボディの Message Type とペイロードのエンコード方式を判断できます。
5. ✅ WebSocket の Protobuf(macOS 6.5.0 以降)
- 1 つのバイナリ WebSocket フレームをデコードするには、websocket.md を参照してください。
- WebSocket 用の Protobuf ルールを作成できます。クライアントからのメッセージには Request Message Type を、サーバーからのメッセージには Response Message Type を使用します。
6. トラブルシューティング
6.1 一部の名前フィールドが表示されない
フィールド定義が Protobuf ファイルディスクリプタに含まれていない場合、一部のフィールド名が表示されないことがあります。ディスクリプタが古くなっている可能性があります。
解決方法:
- 古い Protobuf Schema を削除し、サーバーから取得した最新のディスクリプタファイルを追加してください。
- Proxyman 3.5.2 以前を使用している場合は、3.6.0 以降にアップデートしてください。その後、より良い結果を得るためにファイルディスクリプタ(*.desc)を使用してください。