Проверяйте кандидатов в прокси отдельными клиентами 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 не обещает безопасного повтора произвольных транзакций.