class RedirectFollower

Constants

REDIRECT_DEFAULT_LIMIT

Attributes

body[RW]
headers[RW]
redirect_limit[RW]
response[RW]
url[RW]

Public Class Methods

new(url, options = {}) click to toggle source
# File lib/redirect_follower.rb, line 9
def initialize(url, options = {})
  @url = url
  @redirect_limit = options[:redirect_limit] || REDIRECT_DEFAULT_LIMIT
  @headers = options[:headers] || {}
end

Public Instance Methods

redirect_url() click to toggle source
# File lib/redirect_follower.rb, line 38
def redirect_url
  if response['location'].nil?
    response.body.match(/<a href=\"([^>]+)\">/i)[1]
  else
    response['location']
  end
end
resolve() click to toggle source
# File lib/redirect_follower.rb, line 15
def resolve
  raise TooManyRedirects if redirect_limit < 0

  uri = Addressable::URI.parse(url)

  http = Net::HTTP.new(uri.host, uri.inferred_port)
  if uri.scheme == 'https'
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  end

  self.response = http.request_get(uri.request_uri, @headers)

  if response.kind_of?(Net::HTTPRedirection)
    self.url = redirect_url
    self.redirect_limit -= 1
    resolve
  end

  self.body = response.body
  self
end