प्रॉक्सी की सूची तभी उपयोगी होती है जब हर प्रयास उस एंडपॉइंट के लिए कॉन्फ़िगर किया गया क्लाइंट बनाता है। बिना प्रमाणीकरण वाले HTTP प्रॉक्सी से GET करने के लिए 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 उदाहरण मनमाने लेन-देन के सुरक्षित पुनःप्ले का वादा नहीं करता।

संबंधित लेख