Eine Liste von Proxys wird erst nützlich, wenn jeder Versuch einen Client erzeugt, der für diesen Endpunkt konfiguriert ist. Für ein GET über nicht authentifizierte HTTP-Proxys lässt sich Net::HTTP so verwenden:

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

Das vierte Argument wählt den Proxy-Port; uri.host und uri.port bezeichnen weiterhin das Ziel. Fülle die beiden Beispieleinträge aus der HTTP-Proxy-Liste, wenn du eine erlaubte öffentliche URL über nicht authentifizierte HTTP-Endpunkte prüfst. request_uri behält Pfad und Query. Das Beispiel behandelt gewöhnliche Verbindungs- und Lesefehler und vermerkt einen HTTP-Status, sobald einer eintrifft.

Hier beendet jede 2xx-Antwort die Suche. Erwartet dein Vorgang ein anderes Ergebnis, definiere dieses Kriterium ausdrücklich. Eine Weiterleitung belegt nicht automatisch, dass die gewünschte Seite geholt wurde.

Halte automatische Wiederholungen passend zur Methode. Ein POST, der nach dem Senden seines Bodys in einen Timeout läuft, hat die entfernte Anwendung möglicherweise schon verändert; ein neuer Versuch über einen anderen Proxy kann diesen Effekt wiederholen. Das GET-Beispiel verspricht kein sicheres Wiederholen beliebiger Transaktionen.

Ähnliche Artikel