Ruby(net::http、http gem)の HTTP/HTTPS 通信をキャプチャ
このブログでは、Ruby スクリプト(net/http と http)ライブラリから HTTP/HTTPS 通信をキャプチャする方法を紹介します。
このブログで扱う内容
- Proxyman を使い、Ruby スクリプト(net/http または http gem)から HTTP/HTTPS 通信をキャプチャする方法
1. Ruby で HTTPS リクエストを送信する
Ruby 開発者であれば、次のライブラリを使って HTTP(S) リクエストを送信することに多くの時間を費やしているかもしれません。
- Net::HTTP:Ruby に標準で組み込まれているライブラリです。HTTP のリクエスト/レスポンスプロトコルを使うクライアントを実装するための、豊富な API を提供します。
- http:サードパーティ製の gem です。Net::HTTP よりも使いやすいクライアントライブラリとして設計されています。
次のサンプルコードは、両方のライブラリでリクエストを送信する方法を示しています。
require "http"
require 'net/http'
# Use net/http
uri = URI('https://httpbin.org/post?lib=net_http')
res = Net::HTTP.post_form(uri, 'isSSL' => 'true')
puts(res)
# Use http gem
res = HTTP.get("https://httpbin.org/get?lib=http").to_s
puts(res)
実行するには、サンプルを client.rb として保存し、ターミナルアプリを開いて、ruby client.rb を実行するだけです。

2. HTTP/HTTPS をキャプチャする方法
現状の問題
デフォルトでは、両方のライブラリ(net/http と http gem)は、システムの HTTP プロキシ設定や HTTP_PROXY、HTTPS_PROXY 環境変数を使用しません。Fiddler や Charles Proxy を使っている場合、その通信は表示されないことがあります。
これを解決するには、プロキシ設定を手動で追加する必要があります。net/http の設定例は次のとおりです。
proxy_addr = 'localhost'
proxy_port = 9090
Net::HTTP.new('example.com', nil, proxy_addr, proxy_port).start { |http|
# always proxy via localhost:9090
}
詳しくは net::http Proxy をご覧ください。
ソースコードを手動で変更する必要があるため、ミスが起きやすく、時間もかかります。
解決策 ✅
幸いなことに、Proxyman には、設定なしで HTTP/HTTPS のリクエスト/レスポンスをキャプチャできる機能があります。
- 最新の macOS 版アプリを https://proxyman.com/ からダウンロードします
- Mac に Proxyman の証明書をインストールします。Certificate メニュー -> Install Certificate on this Mac… を開き、「Install & Trust」ボタンをクリックすればインストールできます。

- Setup メニュー -> Automatic を開き、「New Terminal app…」をクリックします

- 新しいターミナルアプリが表示されます。これは事前設定済みの Apple の Terminal アプリで、Ruby からの HTTPS 通信を自動的にキャプチャして復号します。
- 新しいターミナルアプリで、もう一度
ruby client.rbを実行します。すると、すべての HTTP/HTTPS 通信が Proxyman によってキャプチャされ、復号されます 🎉

- 完了です。
- 仕組みの詳細を知りたい場合は、こちらの Automatic Setup のドキュメント をご覧ください
- 普段お使いのターミナル(iTerm2 や Hyper など)を使いたい場合は、Manual Setup をご覧ください。
対応している Ruby ライブラリ
Proxyman は、http、net/http、net/https、faraday、httparty、fastlane に標準で対応しています。
まとめ
Ruby スクリプト(net/http や http gem)から HTTP/HTTPS 通信をキャプチャするのは、ミスが起きやすく時間もかかります。しかし、Proxyman の Automatic Setup を使えば、設定なしかつワンクリックで実現できます。
この設定は、Proxyman が開いた新しいターミナルセッションにのみ適用されます。そのため、Ruby のコマンドはそのウィンドウで実行してください。普段お使いのシェル設定ファイルは変更されません。それでも特定のライブラリの通信が表示されない場合は、そのライブラリのプロキシ設定を出力し、環境変数によるプロキシを無効にしていないか確認してください。また、同じターミナルから https://httpbin.org/get へ簡単なリクエストを送れるかも確認してください。
Proxyman は、iOS デバイス、iOS シミュレータ、Android デバイス上のアプリやドメインの HTTP(S) 通信をキャプチャして検査できる、高性能な macOS アプリです。
入手はこちら:https://proxyman.com/
