Lista proxy staje się przydatna dopiero wtedy, gdy każda próba tworzy klienta skonfigurowanego dla tego punktu końcowego. Do GET przez nieuwierzytelnione proxy HTTP można użyć Net::HTTP w ten sposób:

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

Czwarty argument wybiera port proxy; uri.host i uri.port nadal wskazują cel. Uzupełnij dwa przykładowe wpisy z listy proxy HTTP, gdy sprawdzasz dozwolony publiczny URL przez nieuwierzytelnione punkty końcowe HTTP. request_uri zachowuje swoją ścieżkę i zapytanie. Przykład obsługuje zwykłe błędy połączenia i odczytu oraz zapisuje status HTTP, gdy jakiś nadejdzie.

Tutaj każda odpowiedź 2xx kończy wyszukiwanie. Jeśli twoja operacja oczekuje innego wyniku, zdefiniuj to kryterium wprost. Przekierowanie samo nie dowodzi, że żądana strona została pobrana.

Dopasuj automatyczne powtarzanie do metody. POST, który przekroczy limit czasu po wysłaniu treści, mógł już zmienić zdalną aplikację; ponowna próba przez inne proxy może powtórzyć ten efekt. Przykład GET nie obiecuje bezpiecznego powtarzania dowolnych transakcji.

Powiązane artykuły