Prova proxykandidater med separata Ruby Net::HTTP-klienter
Skapa en Net::HTTP-instans per proxykandidat och stoppa enligt svaret som din operation faktiskt behöver.
En lista med proxys blir först användbar när varje försök skapar en klient som är konfigurerad för den slutpunkten. För en GET via HTTP-proxys utan autentisering kan Net::HTTP användas så här:
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
endDet fjärde argumentet väljer proxyporten; uri.host och uri.port anger fortfarande målet. Fyll i de två exempelposterna från HTTP-proxylistan när du kontrollerar en tillåten offentlig URL via HTTP-slutpunkter utan autentisering. request_uri behåller sin sökväg och fråga. Exemplet hanterar vanliga anslutnings- och läsfel och registrerar en HTTP-status när en kommer.
Här avslutar varje 2xx-svar sökningen. Om din operation förväntar sig ett annat resultat, definiera det kriteriet uttryckligen. En omdirigering bevisar inte automatiskt att den önskade sidan hämtades.
Håll automatisk upprepning lämplig för metoden. En POST som får timeout efter att kroppen skickats kan redan ha ändrat fjärrapplikationen; ett nytt försök via en annan proxy kan upprepa den effekten. GET-exemplet lovar inte säker uppspelning av godtyckliga transaktioner.