Una llista de proxys només és útil quan cada intent crea un client configurat per a aquell punt final. Per a un GET a través de proxys HTTP sense autenticació, Net::HTTP es pot fer servir així:

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

El quart argument tria el port del proxy; uri.host i uri.port continuen identificant la destinació. Omple les dues entrades de l'exemple des de la llista de proxys HTTP quan comprovis una URL pública permesa a través de punts HTTP sense autenticació. request_uri conserva el camí i la consulta. L'exemple gestiona errors habituals de connexió i lectura i registra un estat HTTP quan n'arriba un.

Aquí qualsevol resposta 2xx acaba la cerca. Si la teva operació espera un altre resultat, defineix aquest criteri explícitament. Una redirecció no demostra automàticament que s'hagi obtingut la pàgina desitjada.

Mantingues la repetició automàtica adequada al mètode. Un POST que expira després d'enviar el cos pot haver canviat ja l'aplicació remota; tornar-ho a provar per un altre proxy pot repetir aquest efecte. L'exemple GET no promet una repetició segura de transaccions arbitràries.

Articles relacionats