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