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

Схожі статті