Изпробвайте прокси кандидати с отделни клиенти Ruby Net::HTTP
Създавайте по един екземпляр Net::HTTP за всеки кандидат за прокси и спирайте според отговора, който операцията ви наистина изисква.
Списъкът с прокси сървъри става полезен едва когато всеки опит създаде клиент, настроен за тази крайна точка. За GET през HTTP прокси сървъри без удостоверяване Net::HTTP може да се използва така:
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Четвъртият аргумент избира порта на прокси сървъра; uri.host и uri.port продължават да означават дестинацията. Попълнете двата примерни записа от списъка с HTTP прокси сървъри, когато проверявате разрешен публичен URL през HTTP крайни точки без удостоверяване. request_uri запазва пътя и заявката си. Примерът обработва обичайните грешки при свързване и четене и записва HTTP статус, когато пристигне.
Тук всеки отговор 2xx прекратява търсенето. Ако операцията ви очаква друг резултат, дефинирайте този критерий изрично. Пренасочването не доказва автоматично, че желаната страница е получена.
Пазете автоматичното повторение съобразено с метода. POST, който изтече след изпращане на тялото си, може вече да е променил отдалеченото приложение; нов опит през друго прокси може да повтори този ефект. Примерът с GET не обещава безопасно повторение на произволни транзакции.