Provare proxy candidati con client Ruby Net::HTTP separati
Crea un'istanza Net::HTTP per ogni proxy candidato e fermati in base alla risposta che la tua operazione richiede davvero.
Un elenco di proxy diventa utile solo quando ogni tentativo crea un client configurato per quell'endpoint. Per una GET attraverso proxy HTTP senza autenticazione, Net::HTTP si usa così:
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
endIl quarto argomento sceglie la porta del proxy; uri.host e uri.port indicano ancora la destinazione. Compila le due voci di esempio dall'elenco dei proxy HTTP quando verifichi un URL pubblico consentito tramite endpoint HTTP senza autenticazione. request_uri conserva il percorso e la query. L'esempio gestisce i normali errori di connessione e lettura e registra uno stato HTTP quando ne arriva uno.
Qui qualsiasi risposta 2xx termina la ricerca. Se la tua operazione si aspetta un altro risultato, definisci quel criterio in modo esplicito. Un reindirizzamento non dimostra da solo che la pagina desiderata sia stata recuperata.
Mantieni la ripetizione automatica adatta al metodo. Un POST che va in timeout dopo l'invio del corpo potrebbe aver già modificato l'applicazione remota; riprovare tramite un altro proxy può ripetere quell'effetto. L'esempio GET non promette una riproduzione sicura di transazioni arbitrarie.