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