この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
外部のシステムとの連携をテストしたいけど、気軽にそのシステムのAPIが叩けないとかいうときに役立つTips
CoCProxyとは
簡単に言うと、普段は何もせずリクエストを右から左に受け渡すが、ローカルにそのリクエストのホスト名とパスに相当する場所にファイルを置くと、実際にリモートにリクエストしたフリしてローカルのファイルの内容をレスポンスとして返してくれるプロキシという感じです。
GitHubが流行る前に CodeRepos という公開リポジトリがありそこにアップロードされていた Ruby 製ツールでしたが、現在その派生版として nginx モジュール版と、今回紹介する Node.js 版があるようです。
インストール
node.js 版をインストールは以下のとおり。
$ npm install -g cocproxy
基本的な使い方
適当な場所にディレクトリを用意(たとえば coc_test
とする)してそこに移動。
$ mkdir coc_test
$ cd coc_test
リクエスト対象となるホスト名と同じ名前でディレクトリを掘って、その配下に差し替えたいリソースに合わせてファイルを配置する。
$ mkdir www.google.co.jp
まずは普通にアクセスしてみる
$ curl http://www.google.co.jp/index.html
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head> ....
普通に Google から HTML ファイルが返ってくる。
次に、別のターミナルでCoCProxyを立ち上げ、、、、
$ cocproxy
Proxy stand by: http://localhost:8087
Used mock dir : /home/ec2-user/coc_test
今度はProxyを通してアクセスしてみる。
$ curl http://localhost:8087/http://www.google.co.jp/index.html
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head> ....
まだ差し替えるファイルを用意していないので、今度も普通に Google から HTML ファイルが返ってくる。
次は、cocproxy でファイルを差し替えてみる。
以下のように www.google.co.jp/index.html にファイルを用意する。
$ cat > www.google.co.jp/index.html <<EOF
<!doctype html><title>hello</title>Hello CoCProxy.
EOF
先ほどと同じようにproxy経由でリクエストを投げてみる
$ curl http://localhost:8087/http://www.google.co.jp/index.html
<!doctype html><title>hello</title>Hello CoCProxy.
今度は CoCProxy によってファイルの内容に差し替えられたレスポンスが返ってきたことがわかる
RubyのコードからCoCProxy経由でアクセスしてみる
今度は先程と同様の手順を Ruby のコードで確認します。
# test.rb
require 'net/http'
Net::HTTP.start('www.google.co.jp', 80, :ENV) do |http|
response = http.get('/index.html')
puts response.body
end
Net::HTTPのドキュメントによると、#new や #start メソッドの第3引数に :ENV
を渡すと環境変数 http_proxy
が設定されていればそのProxyを経由するとあります。
試しに、最初は環境変数なしで確認します。
$ ruby test.rb
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" ...
普通に Google のコンテンツが返ってきました。
今度は、環境変数http_proxy
を設定してみます。
$ export http_proxy=http://localhost:8087
$ ruby test.rb
<!doctype html><title>hello</title>Hello CoCProxy.
今度はローカルで用意したファイルの中身が返ってきました。
CoCProxy をProxyとして利用することでリモートに手を加えることなくレスポンスを変更することができることがわかりました。
まとめ
- CoCProxy を使えばクライアント側のコードを変更せずにProxyでファイルを差し替えることができる
- RubyのコードからProxyを利用する場合、そのライブラリに応じた設定が必要な場合がある
- 標準ライブラリ Net::HTTP の場合、.new, .start メソッドの第3引数に
:ENV
を設定しているときhttp_proxy
環境変数に値を設定されている場合そのProxyを経由してアクセスする
- 標準ライブラリ Net::HTTP の場合、.new, .start メソッドの第3引数に