لا تصبح قائمة البروكسيات مفيدة إلا حين ينشئ كل محاولة عميلاً مُهيّأً لذلك العنوان. لطلب 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 لا يعد بإعادة تنفيذ آمنة لمعاملات عشوائية.

مقالات ذات صلة