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

Падобныя артыкулы