Proxy-Kandidaten mit getrennten Ruby-Net::HTTP-Clients testen
Erzeuge pro Proxy-Kandidat eine Net::HTTP-Instanz und beende den Versuch nach der Antwort, die dein Vorgang tatsächlich braucht.
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
endDas 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.