Ruby - net/http - following redirects

后端 未结 6 1054
北恋
北恋 2020-12-01 03:05

I\'ve got a URL and I\'m using HTTP GET to pass a query along to a page. What happens with the most recent flavor (in net/http) is that the script doesn\'t go

6条回答
  •  一向
    一向 (楼主)
    2020-12-01 03:36

    I wrote another class for this based on examples given here, thank you very much everybody. I added cookies, parameters and exceptions and finally got what I need: https://gist.github.com/sekrett/7dd4177d6c87cf8265cd

    require 'uri'
    require 'net/http'
    require 'openssl'
    
    class UrlResolver
      def self.resolve(uri_str, agent = 'curl/7.43.0', max_attempts = 10, timeout = 10)
        attempts = 0
        cookie = nil
    
        until attempts >= max_attempts
          attempts += 1
    
          url = URI.parse(uri_str)
          http = Net::HTTP.new(url.host, url.port)
          http.open_timeout = timeout
          http.read_timeout = timeout
          path = url.path
          path = '/' if path == ''
          path += '?' + url.query unless url.query.nil?
    
          params = { 'User-Agent' => agent, 'Accept' => '*/*' }
          params['Cookie'] = cookie unless cookie.nil?
          request = Net::HTTP::Get.new(path, params)
    
          if url.instance_of?(URI::HTTPS)
            http.use_ssl = true
            http.verify_mode = OpenSSL::SSL::VERIFY_NONE
          end
          response = http.request(request)
    
          case response
            when Net::HTTPSuccess then
              break
            when Net::HTTPRedirection then
              location = response['Location']
              cookie = response['Set-Cookie']
              new_uri = URI.parse(location)
              uri_str = if new_uri.relative?
                          url + location
                        else
                          new_uri.to_s
                        end
            else
              raise 'Unexpected response: ' + response.inspect
          end
    
        end
        raise 'Too many http redirects' if attempts == max_attempts
    
        uri_str
        # response.body
      end
    end
    
    puts UrlResolver.resolve('http://www.ruby-lang.org')
    

提交回复
热议问题