その他
    ホーム 技術発信 DoRuby CoCProxyでリクエストを飛ばさずにWebクライアントをテストする
    CoCProxyでリクエストを飛ばさずにWebクライアントをテストする
     

    CoCProxyでリクエストを飛ばさずにWebクライアントをテストする

    この記事はアピリッツの技術ブログ「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を経由してアクセスする