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
end

El 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.

Artículos relacionados