프록시 목록은 각 시도가 해당 엔드포인트에 맞게 구성된 클라이언트를 만들 때에만 쓸모가 있습니다. 인증이 없는 HTTP 프록시를 통한 GET은 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

네 번째 인수가 프록시 포트를 선택하며, uri.host와 uri.port는 여전히 목적지를 가리킵니다. 인증이 없는 HTTP 엔드포인트로 허용된 공개 URL을 확인할 때 예제의 두 항목을 HTTP 프록시 목록에서 채우십시오. request_uri는 경로와 쿼리를 유지합니다. 예제는 일반적인 연결 및 읽기 실패를 처리하고 HTTP 상태가 오면 기록합니다.

여기서는 어떤 2xx 응답이든 탐색을 끝냅니다. 작업이 다른 결과를 기대한다면 그 기준을 분명히 정의하십시오. 리다이렉트는 원하는 페이지를 실제로 가져왔다는 것을 자동으로 증명하지 않습니다.

자동 재시도는 메서드에 맞게 유지하십시오. 본문을 보낸 뒤 시간 초과된 POST는 이미 원격 애플리케이션을 바꿨을 수 있습니다. 다른 프록시로 다시 시도하면 그 효과가 반복될 수 있습니다. GET 예제는 임의의 트랜잭션을 안전하게 재실행한다고 약속하지 않습니다.

관련 글