Μια λίστα με proxy γίνεται χρήσιμη μόνο όταν κάθε προσπάθεια δημιουργεί έναν πελάτη ρυθμισμένο για αυτό το τελικό σημείο. Για ένα GET μέσω proxy HTTP χωρίς έλεγχο ταυτότητας, το 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

Το τέταρτο όρισμα επιλέγει τη θύρα του proxy· τα uri.host και uri.port εξακολουθούν να δηλώνουν τον προορισμό. Συμπληρώστε τις δύο καταχωρήσεις του παραδείγματος από τη λίστα proxy HTTP όταν ελέγχετε μια επιτρεπόμενη δημόσια διεύθυνση URL μέσω τελικών σημείων HTTP χωρίς έλεγχο ταυτότητας. Το request_uri διατηρεί τη διαδρομή και το ερώτημα. Το παράδειγμα χειρίζεται συνήθη σφάλματα σύνδεσης και ανάγνωσης και καταγράφει κατάσταση HTTP όταν φτάσει μία.

Εδώ οποιαδήποτε απόκριση 2xx τερματίζει την αναζήτηση. Αν η λειτουργία σας περιμένει άλλο αποτέλεσμα, ορίστε ρητά αυτό το κριτήριο. Μια ανακατεύθυνση δεν αποδεικνύει αυτόματα ότι ανακτήθηκε η επιθυμητή σελίδα.

Κρατήστε την αυτόματη επανάληψη κατάλληλη για τη μέθοδο. Ένα POST που λήγει αφού σταλεί το σώμα του μπορεί να έχει ήδη αλλάξει την απομακρυσμένη εφαρμογή· μια νέα προσπάθεια μέσω άλλου proxy μπορεί να επαναλάβει αυτό το αποτέλεσμα. Το παράδειγμα GET δεν υπόσχεται ασφαλή επανάληψη αυθαίρετων συναλλαγών.

Σχετικά άρθρα