فهرست پروکسی تنها زمانی مفید می‌شود که هر تلاش کلاینتی متناسب با همان نقطه پایانی بسازد. برای یک 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 پر کنید هنگامی که یک نشانی عمومی مجاز را از طریق نقاط پایانی HTTP بدون احراز هویت بررسی می‌کنید. request_uri مسیر و پرس‌وجوی خود را حفظ می‌کند. نمونه خطاهای معمول اتصال و خواندن را مدیریت می‌کند و در صورت رسیدن، وضعیت HTTP را ثبت می‌کند.

اینجا هر پاسخ 2xx جست‌وجو را پایان می‌دهد. اگر عملیات شما نتیجه دیگری انتظار دارد، آن معیار را صریح تعریف کنید. یک تغییر مسیر به‌طور خودکار ثابت نمی‌کند که صفحه مورد نظر دریافت شده است.

تکرار خودکار را متناسب با متد نگه دارید. یک POST که پس از ارسال بدنه‌اش زمان‌سنجی می‌شود ممکن است برنامه راه دور را از قبل تغییر داده باشد؛ تلاش دوباره از طریق پروکسی دیگر می‌تواند همان اثر را تکرار کند. نمونه GET بازپخش ایمن تراکنش‌های دلخواه را وعده نمی‌دهد.

مقالات مرتبط