個別の Ruby Net::HTTP クライアントでプロキシ候補を試す
プロキシ候補ごとに Net::HTTP インスタンスを 1 つ作り、実際の処理に必要な応答に応じて停止します。
プロキシの一覧は、試行ごとにそのエンドポイント向けに設定したクライアントを作るときに初めて役立ちます。認証なしの HTTP プロキシ経由で GET する場合、Net::HTTP は次のように使えます。
require 'net/http'
uri = URI('https://www.example.com/status')
proxies = ['http://proxy-a.example:8080',
'http://proxy-b.example:8080']
proxies.each do |value|
proxy = URI(value)
http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port)
http.use_ssl = uri.scheme == 'https'
http.open_timeout = 5
http.read_timeout = 10
begin
response = http.get(uri.request_uri)
puts "#{proxy.host}:#{proxy.port} #{response.code}"
break if response.is_a?(Net::HTTPSuccess)
rescue Net::OpenTimeout, Net::ReadTimeout, SocketError, SystemCallError, IOError => error
warn "#{proxy.host}:#{proxy.port} #{error.class}"
end
end四番目の引数がプロキシのポートを選び、uri.host と uri.port は引き続き宛先を指します。認証なしの HTTP エンドポイント経由で許可された公開 URL を確認するときは、サンプルの 2 件をHTTP プロキシ一覧から埋めてください。request_uri はパスとクエリを保持します。サンプルは通常の接続・読み取り失敗を処理し、HTTP ステータスが返れば記録します。
ここでは 2xx の応答が来た時点で探索を終えます。処理が別の結果を期待するなら、その条件を明示してください。リダイレクトは、目的のページを取得したことを自動的に証明するものではありません。
自動的な再試行はメソッドに合わせてください。本文を送った後にタイムアウトした POST は、リモート側をすでに変更している可能性があります。別のプロキシで再試行すると同じ効果を繰り返すことがあります。GET のサンプルは、任意のトランザクションを安全に再実行できるとは約束していません。