Testați candidați proxy cu clienți Ruby Net::HTTP separați
Creați o instanță Net::HTTP pentru fiecare candidat proxy și opriți-vă potrivit răspunsului de care operația dvs. are cu adevărat nevoie.
O listă de proxy devine utilă abia când fiecare încercare creează un client configurat pentru acel punct final. Pentru un GET prin proxy HTTP fără autentificare, Net::HTTP poate fi folosit astfel:
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
endAl patrulea argument alege portul proxy; uri.host și uri.port indică în continuare destinația. Completați cele două intrări din exemplu din lista de proxy HTTP când verificați un URL public permis prin puncte finale HTTP fără autentificare. request_uri își păstrează calea și interogarea. Exemplul tratează eșecurile obișnuite de conectare și citire și înregistrează un status HTTP când sosește unul.
Aici orice răspuns 2xx încheie căutarea. Dacă operația dvs. așteaptă alt rezultat, definiți explicit acel criteriu. O redirecționare nu dovedește automat că pagina dorită a fost obținută.
Păstrați repetarea automată potrivită metodei. Un POST care expiră după trimiterea corpului poate fi modificat deja aplicația de la distanță; o nouă încercare prin alt proxy poate repeta acel efect. Exemplul GET nu promite o reluare sigură a unor tranzacții arbitrare.