Proba candidatos de proxy con clientes Ruby Net::HTTP separados
Crea unha instancia de Net::HTTP por candidato de proxy e detente segundo a resposta que a túa operación realmente necesita.
Unha lista de proxies só resulta útil cando cada intento crea un cliente configurado para ese punto final. Para un GET a través de proxies HTTP sen autenticación, Net::HTTP pódese usar 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
endO cuarto argumento escolle o porto do proxy; uri.host e uri.port seguen identificando o destino. Enche as dúas entradas do exemplo dende a lista de proxies HTTP cando comprobes un URL público permitido a través de puntos HTTP sen autenticación. request_uri conserva a súa ruta e a súa consulta. O exemplo xestiona fallos habituais de conexión e lectura e rexistra un estado HTTP cando chega un.
Aquí calquera resposta 2xx remata a busca. Se a túa operación espera outro resultado, define ese criterio de forma explícita. Unha redirección non demostra por si soa que se obtivese a páxina desexada.
Mantén a repetición automática axeitada ao método. Un POST que esgota o tempo despois de enviar o seu corpo pode ter cambiado xa a aplicación remota; reintentalo por outro proxy pode repetir ese efecto. O exemplo GET non promete unha repetición segura de transaccións arbitrarias.