Skip to content

feat: protoファイルを読み込み、gRPC通信のフィールド名を補完#242

Open
taka2233 wants to merge 22 commits intoDeNA:masterfrom
taka2233:feat/grpc-proto-completion
Open

feat: protoファイルを読み込み、gRPC通信のフィールド名を補完#242
taka2233 wants to merge 22 commits intoDeNA:masterfrom
taka2233:feat/grpc-proto-completion

Conversation

@taka2233
Copy link
Copy Markdown
Contributor

@taka2233 taka2233 commented Apr 27, 2026

概要

gRPC 通信を .proto ファイルに基づいてデコード/エンコードする機能を追加しています。

gRPC エンコーダは、フィールド番号ベースのデコードしていましたが、ユーザーが .proto ファイルを読み込むことで フィールド名つきの JSON 形式での表示するようにしました。

動作の流れ

  1. 設定画面で「Import Proto File」→ .proto ファイルを選択 → protoc.desc を生成
  2. gRPC 通信時、エンコーダが HTTP authority ヘッダから対象 Server を特定し、対応する .desc を読み込む
  3. gRPC path (/package.Service/Method) からリクエスト/レスポンスの型を解決し、フィールド名を補完してJSONに変換する
  4. .desc が未設定 or 解決できない場合は、従来のジェネリック protobuf デコードにフォールバック

UI

gRPCエンコーダー選択時にImport Proto Fileのボタンを表示

image

gRPCエンコーダー選択時にImport Proto Fileのボタンを表示

image

.protoファイルのImportと、descファイルの生成

image

gRPCのフィールド名を補完

ファイル差分

1. 補完ロジック

ファイル 役割
GrpcServiceRegistry.kt .desc から gRPC path → input/output Descriptor のマッピングを構築
GrpcServiceRegistryStore.kt .desc ファイルのキャッシュ管理 + authority → Server → .desc の解決チェーン
GrpcSchemaResolver.kt エンコーダから呼ばれる facade。registry 解決 + JSON⇔protobuf 変換
EncodeGRPC.java 非ストリーミング gRPC エンコーダー
EncodeGRPCStreaming.java ストリーミング gRPC エンコーダー

2. 永続化

ファイル 役割
Server.java descriptor_path カラム追加
Servers.java 既存 DB への ALTER TABLE マイグレーション

3. GUI / protoc 実行

ファイル 役割
GUIOptionServerDialog.java Server 設定画面に「Import Proto File」ボタンを追加
GUIOptionGrpcDescriptorDialog.kt .proto 選択 → .desc 生成 → サービス一覧表示の統合ダイアログ
ProtocRunner.kt protoc の実行ラッパー
ProtoFileSet.kt .proto ファイルの重複排除・include パス計算
NativeFileChooser.java ディレクトリ選択ダイアログの追加

4. テスト

ファイル カバー範囲
GrpcServiceRegistryTest.kt path→型の解決、ネストメッセージの検索
GrpcServiceRegistryStoreTest.kt .desc のロード/キャッシュ、--include_imports 無しの検出、authority パース、ListenPort フォールバック
ProtoFileSetTest.kt .proto の重複排除、include パス計算

5. その他

  • build.gradle: protobuf-java-util 依存追加(JsonFormat に必要)
  • src/test/resources/packetproxy/grpc/proto/: テスト用 .proto / .desc fixture

前提条件

  • ユーザーの PATHprotoc が含まれている必要があります(.desc 生成時のみ)
  • .desc~/.packetproxy/grpc_desc/ 以下に {project}_{serverId}.desc として保存されます

制約

  • .desc のホットリロードは未対応(Server 設定画面から再生成が必要)

テスト

  • ./gradlew test --tests "packetproxy.grpc.*" パス確認済み
  • 手動: Server 設定で .proto をインポートし、.desc が生成されることを確認
  • 手動: gRPC unary RPC でフィールド名つき JSON が表示されることを確認
  • 手動: gRPC Streaming でフィールド名つき JSON が表示されることを確認
  • 手動: .desc 未設定時に従来のジェネリック表示にフォールバックすることを確認
  • 手動: Interceptorで停止後、forwardで送信できることを確認
  • 手動: Resenderで再送できることを確認 (gRPC Streaming Encoderでは未確認)
  • 手動: VulCheck Helperで送信できることを確認 (gRPC Streaming Encoderでは未確認)
  • 手動: Bulk Senderで送信できることを確認 (gRPC Streaming Encoderでは未確認)

taka2233 added 22 commits April 24, 2026 18:26
…ress in encoder instance creation and enhance gRPC handling with descriptor file management
…ent and add GUIOptionProtoCompileDialog for .proto file handling
…PacketAttackController to include server information
…ement, replacing the previous ProtoCompileDialog
…log and enhance ProtocRunner for consistent file naming
…odeGRPC and EncodeGRPCStreaming for improved gRPC body handling and remove DescriptorSetLoader references
…h GrpcServiceRegistry for improved gRPC body handling in EncodeGRPC and EncodeGRPCStreaming
…treaming by implementing schema-aware body decoding and encoding, while maintaining compatibility with existing functionality
…d methods for improved functionality in svc_a and svc_b
…Resolver for improved schema-aware encoding and decoding in EncodeGRPC and EncodeGRPCStreaming
@taka2233 taka2233 marked this pull request as ready for review April 28, 2026 08:33
@taka2233 taka2233 changed the title Feat/grpc proto completion feat: protoファイルを読み込み、gRPC通信のフィールド名を補完 Apr 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant