Proxys testen met afzonderlijke Ruby Net::HTTP-clients
Maak één Net::HTTP-instantie per proxykandidaat en stop op basis van de respons die je bewerking echt nodig heeft.
Een lijst met proxys wordt pas nuttig wanneer elke poging een client maakt die voor dat eindpunt is geconfigureerd. Voor een GET via niet-geauthenticeerde HTTP-proxys kan Net::HTTP zo worden gebruikt:
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
endHet vierde argument kiest de proxy-poort; uri.host en uri.port wijzen nog steeds het doel aan. Vul de twee voorbeeldregels uit de HTTP-proxylijst in wanneer je een toegestane openbare URL via niet-geauthenticeerde HTTP-eindpunten controleert. request_uri behoudt zijn pad en query. Het voorbeeld behandelt gewone verbindings- en leesfouten en noteert een HTTP-status wanneer die binnenkomt.
Hier beëindigt elk 2xx-antwoord de zoektocht. Als je bewerking een ander resultaat verwacht, definieer dat criterium dan expliciet. Een omleiding bewijst niet automatisch dat de gewenste pagina is opgehaald.
Houd automatische herhaling passend bij de methode. Een POST die na het verzenden van zijn body in een time-out loopt, heeft de externe toepassing mogelijk al gewijzigd; opnieuw proberen via een andere proxy kan dat effect herhalen. Het GET-voorbeeld belooft geen veilige herhaling van willekeurige transacties.