Isprobajte kandidate za proxy sa odvojenim Ruby Net::HTTP klijentima
Napravite jednu Net::HTTP instancu za svakog kandidata za proxy i zaustavite se prema odgovoru koji vaša operacija zaista treba.
Lista proxyja postaje korisna tek kada svaki pokušaj stvori klijenta konfigurisanog za tu odredišnu tačku. Za GET kroz HTTP proxije bez autentifikacije, Net::HTTP se može koristiti ovako:
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Četvrti argument bira port proxyja; uri.host i uri.port i dalje označavaju odredište. Popunite dva primera iz liste HTTP proxyja kada proveravate dozvoljeni javni URL kroz HTTP tačke bez autentifikacije. request_uri zadržava svoju putanju i upit. Primer obrađuje uobičajene greške povezivanja i čitanja i beleži HTTP status kada stigne.
Ovde svaki odgovor 2xx završava pretragu. Ako vaša operacija očekuje drugi rezultat, taj kriterijum definišite izričito. Preusmeravanje ne dokazuje automatski da je željena stranica dohvaćena.
Držite automatsko ponavljanje primerenim metodi. POST koji istekne nakon što je telo poslato možda je već promenio udaljenu aplikaciju; novi pokušaj kroz drugi proxy može ponoviti taj efekat. Primer sa GET-om ne obećava sigurno ponavljanje proizvoljnih transakcija.