Tester des proxys candidats avec des clients Ruby Net::HTTP distincts
Créez une instance Net::HTTP par proxy candidat et arrêtez-vous selon la réponse dont votre opération a réellement besoin.
Une liste de proxys ne devient utile que lorsque chaque tentative crée un client configuré pour ce point de terminaison. Pour un GET via des proxys HTTP sans authentification, Net::HTTP s'utilise ainsi :
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
endLe quatrième argument choisit le port du proxy ; uri.host et uri.port désignent toujours la destination. Renseignez les deux entrées de l'exemple depuis la liste de proxys HTTP lorsque vous vérifiez une URL publique autorisée via des points de terminaison HTTP sans authentification. request_uri conserve son chemin et sa requête. L'exemple gère les échecs ordinaires de connexion et de lecture et note un statut HTTP lorsqu'il en arrive un.
Ici, toute réponse 2xx met fin à la recherche. Si votre opération attend un autre résultat, définissez ce critère explicitement. Une redirection ne prouve pas à elle seule que la page souhaitée a été récupérée.
Gardez les répétitions automatiques adaptées à la méthode. Un POST qui expire après l'envoi de son corps a peut-être déjà modifié l'application distante ; le réessayer via un autre proxy peut reproduire cet effet. L'exemple GET ne promet pas un rejeu sûr de transactions arbitraires.