Prueba candidatos de proxy con clientes Ruby Net::HTTP separados
Crea una instancia de Net::HTTP por candidato de proxy y detente según la respuesta que tu operación realmente necesita.
Una lista de proxies solo resulta útil cuando cada intento crea un cliente configurado para ese punto final. Para un GET a través de proxies HTTP sin autenticación, Net::HTTP puede usarse así:
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
endEl cuarto argumento elige el puerto del proxy; uri.host y uri.port siguen identificando el destino. Rellena las dos entradas del ejemplo desde la lista de proxies HTTP cuando compruebes una URL pública permitida a través de puntos HTTP sin autenticación. request_uri conserva su ruta y su consulta. El ejemplo maneja fallos habituales de conexión y lectura y registra un estado HTTP cuando llega uno.
Aquí cualquier respuesta 2xx termina la búsqueda. Si tu operación espera otro resultado, define ese criterio de forma explícita. Una redirección no demuestra por sí sola que se haya obtenido la página deseada.
Mantén la repetición automática adecuada al método. Un POST que agota el tiempo después de enviar su cuerpo puede haber cambiado ya la aplicación remota; reintentarlo por otro proxy puede repetir ese efecto. El ejemplo GET no promete una repetición segura de transacciones arbitrarias.