Ruby の Mechanize の wiki のよてい

Mechanize::Chain::ConnectionResolver


サーバ接続より前に呼ばれる Chain クラスのひとつです。
Mechanize の接続設定を反映した Net::HTTP オブジェクトを実際に作成します。ただし、同一サーバへの Keep-Alive 接続の場合は直前の Net::HTTP オブジェクトを再利用します。
ユーザーが利用することはありません。



アクセス先 URL を表す params[:uri] のスキームがチェックされ、その値によって処理が分かれます。

http:// または https://
実際に Net::HTTP オブジェクトを作成し、Chain パラメータに登録します。
ただし、Mechanize は過去接続に使用した Net::HTTP オブジェクトをインスタンス内に保持しています。
require 'rubygems'
require 'mechanize'
agent = Mechanize.new
agent.get('http://www.ggoogle.co.jp/')
agent.get('http://www.yahoo.co.jp/')
agent.get('http://headlines.yahoo.co.jp/')
pp agent.instance_variable_get(:@connection_cache)
結果:
{"headlines.yahoo.co.jp:80"=>
  {:connection=>#<Net::HTTP headlines.yahoo.co.jp:80 open=true>,
   :keep_alive_options=>{},
   :last_request_time=>1285304500},
 "www.yahoo.co.jp:80"=>
  {:connection=>#<Net::HTTP www.yahoo.co.jp:80 open=true>,
   :keep_alive_options=>{},
   :last_request_time=>1285304499},
 "www.ggoogle.co.jp:80"=>
  {:connection=>#<Net::HTTP www.ggoogle.co.jp:80 open=false>,
   :keep_alive_options=>{},
   :last_request_time=>1285304499}}
params[:uri] の host と port に向けた Net::HTTP オブジェクトがこれに残っていた場合は、それを再使用して接続します。残っていなかった場合、プロキシ設定である Mechanize#set_proxy の設定を反映させた Net::HTTP オブジェクトを作成します。
ただし、以下の条件を満たす「サーバからのKeep-Alive指示上古くなっている接続」になる場合は、'Finishing stale connection' というログを出力した後破棄され新規作成されます。
  • Mechanize#keep_alive がデフォルトの真のままである
  • 前回のサーバからの Keep-Alive レスポンスヘッダに timeout トークンや max トークンがある
  • その Keep-Alive の timeout が過ぎている、または max の値が 1になっている
何らかの理由で Net::HTTP の再利用を完全に止めたい場合は Mechanize#keep_alive= を false に設定します。

file://
Mechanize::FileResponse? クラスを使って、ローカルのファイルへのアクセスを設定します。

それ以外
未サポートによる例外があとで起こるのでここでは何もしません。


なお、Mechanize 1.0.0 の次のバージョンではこのへんの Keep-Alive 関連の処理がごっそり Net::HTTP::Persistent gem に移動され、簡潔になっています。

管理人/副管理人のみ編集できます