Bir proxy listesi ancak her deneme o uç nokta için yapılandırılmış bir istemci oluşturduğunda işe yarar. Kimlik doğrulaması olmayan HTTP proxy'leri üzerinden GET için Net::HTTP şöyle kullanılabilir:

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

Dördüncü argüman proxy bağlantı noktasını seçer; uri.host ve uri.port hâlâ hedefi belirtir. Kimlik doğrulaması olmayan HTTP uç noktaları üzerinden izin verilen bir genel URL'yi denetlerken örnekteki iki girdiyi HTTP proxy listesinden doldurun. request_uri yolunu ve sorgusunu korur. Örnek, olağan bağlantı ve okuma hatalarını ele alır ve bir HTTP durumu geldiğinde kaydeder.

Burada herhangi bir 2xx yanıtı aramayı bitirir. İşleminiz başka bir sonuç bekliyorsa bu ölçütü açıkça tanımlayın. Yönlendirme, istenen sayfanın alındığını kendiliğinden kanıtlamaz.

Otomatik yinelemeyi yönteme uygun tutun. Gövdesi gönderildikten sonra zaman aşımına uğrayan bir POST uzak uygulamayı çoktan değiştirmiş olabilir; başka bir proxy üzerinden yeniden denemek bu etkiyi yineleyebilir. GET örneği, rastgele işlemlerin güvenli biçimde yeniden oynatılmasını vaat etmez.

İlgili makaleler