Uma lista de proxies só se torna útil quando cada tentativa cria um cliente configurado para esse endpoint. Para um GET através de proxies HTTP sem autenticação, o Net::HTTP pode ser usado assim:

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

O quarto argumento escolhe a porta do proxy; uri.host e uri.port continuam a identificar o destino. Preencha as duas entradas do exemplo a partir da lista de proxies HTTP quando verificar uma URL pública permitida através de endpoints HTTP sem autenticação. request_uri preserva o caminho e a consulta. O exemplo trata falhas comuns de conexão e leitura e registra um status HTTP quando um chega.

Aqui qualquer resposta 2xx encerra a busca. Se sua operação espera outro resultado, defina esse critério explicitamente. Um redirecionamento não prova por si só que a página desejada foi obtida.

Mantenha a repetição automática adequada ao método. Um POST que expira depois de enviar o corpo pode já ter alterado a aplicação remota; tentar de novo por outro proxy pode repetir esse efeito. O exemplo GET não promete uma repetição segura de transações arbitrárias.

Artigos relacionados