Список прокси становится полезным только тогда, когда каждая попытка создаёт клиент, настроенный на эту конечную точку. Для 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 не обещает безопасного повтора произвольных транзакций.

Похожие статьи