Teste candidatos de proxy com clientes Ruby Net::HTTP separados
Crie uma instância Net::HTTP por candidato de proxy e pare conforme a resposta que sua operação realmente precisa.
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
endO 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.