O listă de proxy devine utilă abia când fiecare încercare creează un client configurat pentru acel punct final. Pentru un GET prin proxy HTTP fără autentificare, Net::HTTP poate fi folosit astfel:

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

Al patrulea argument alege portul proxy; uri.host și uri.port indică în continuare destinația. Completați cele două intrări din exemplu din lista de proxy HTTP când verificați un URL public permis prin puncte finale HTTP fără autentificare. request_uri își păstrează calea și interogarea. Exemplul tratează eșecurile obișnuite de conectare și citire și înregistrează un status HTTP când sosește unul.

Aici orice răspuns 2xx încheie căutarea. Dacă operația dvs. așteaptă alt rezultat, definiți explicit acel criteriu. O redirecționare nu dovedește automat că pagina dorită a fost obținută.

Păstrați repetarea automată potrivită metodei. Un POST care expiră după trimiterea corpului poate fi modificat deja aplicația de la distanță; o nouă încercare prin alt proxy poate repeta acel efect. Exemplul GET nu promite o reluare sigură a unor tranzacții arbitrare.

Articole similare