class Saviour::UrlSource

Constants

ConnectionFailed
InvalidUrl
MAX_REDIRECTS
TooManyRedirects

Public Class Methods

new(url) click to toggle source
# File lib/saviour/url_source.rb, line 12
def initialize(url)
  @uri = wrap_uri_string(url)
end

Public Instance Methods

original_filename() click to toggle source
# File lib/saviour/url_source.rb, line 24
def original_filename
  ::File.basename(@uri.path)
end
read(*args) click to toggle source
# File lib/saviour/url_source.rb, line 16
def read(*args)
  stringio.read(*args)
end
rewind() click to toggle source
# File lib/saviour/url_source.rb, line 20
def rewind
  stringio.rewind
end

Private Instance Methods

raw_data() click to toggle source
# File lib/saviour/url_source.rb, line 35
def raw_data
  @raw_data ||= with_retry(3) { resolve(@uri) }
end
resolve(uri, max_redirects = MAX_REDIRECTS) click to toggle source
# File lib/saviour/url_source.rb, line 39
def resolve(uri, max_redirects = MAX_REDIRECTS)
  raise TooManyRedirects, "Max number of allowed redirects reached (#{MAX_REDIRECTS}) when resolving #{uri}" if max_redirects == 0

  response = Net::HTTP.get_response(uri)

  case response
    when Net::HTTPSuccess
      response.body
    when Net::HTTPRedirection
      resolve(wrap_uri_string(response['location']), max_redirects - 1)
    else
      false
  end
end
stringio() click to toggle source
# File lib/saviour/url_source.rb, line 31
def stringio
  @stringio ||= StringIO.new(raw_data)
end
with_retry(n = 3, &block) click to toggle source
# File lib/saviour/url_source.rb, line 62
def with_retry(n = 3, &block)
  raise(ConnectionFailed, "Connection to #{@uri} failed after 3 attempts.") if n == 0

  block.call || with_retry(n - 1, &block)
end
wrap_uri_string(url) click to toggle source
# File lib/saviour/url_source.rb, line 54
def wrap_uri_string(url)
  begin
    URI(url)
  rescue URI::InvalidURIError
    raise InvalidUrl, "'#{url}' is not a valid URI"
  end
end