Sha256: 4cb3e72b9619f60f488bf2a2c61b11d4d9ea22e88efd794c9fb0773de272f8b1

Contents?: true

Size: 1.42 KB

Versions: 32

Compression:

Stored size: 1.42 KB

Contents

require 'uri'
require 'net/http'

module Saviour
  class UrlSource
    TooManyRedirects = Class.new(StandardError)
    InvalidUrl = Class.new(StandardError)
    ConnectionFailed = Class.new(StandardError)

    MAX_REDIRECTS = 10

    def initialize(url)
      @uri = wrap_uri_string(url)
    end

    def read(*args)
      stringio.read(*args)
    end

    def rewind
      stringio.rewind
    end

    def original_filename
      ::File.basename(@uri.path)
    end


    private

    def stringio
      @stringio ||= StringIO.new(raw_data)
    end

    def raw_data
      @raw_data ||= with_retry(3) { resolve(@uri) }
    end

    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

    def wrap_uri_string(url)
      begin
        URI(url)
      rescue URI::InvalidURIError
        raise InvalidUrl, "'#{url}' is not a valid URI"
      end
    end

    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
  end
end

Version data entries

32 entries across 32 versions & 1 rubygems

Version Path
saviour-0.6.10 lib/saviour/url_source.rb
saviour-0.6.9 lib/saviour/url_source.rb
saviour-0.6.8 lib/saviour/url_source.rb
saviour-0.6.7 lib/saviour/url_source.rb
saviour-0.6.6 lib/saviour/url_source.rb
saviour-0.6.5 lib/saviour/url_source.rb
saviour-0.6.4 lib/saviour/url_source.rb
saviour-0.6.3 lib/saviour/url_source.rb
saviour-0.6.2 lib/saviour/url_source.rb
saviour-0.6.1 lib/saviour/url_source.rb
saviour-0.6.0 lib/saviour/url_source.rb
saviour-0.5.11 lib/saviour/url_source.rb
saviour-0.5.10 lib/saviour/url_source.rb
saviour-0.5.9 lib/saviour/url_source.rb
saviour-0.5.8 lib/saviour/url_source.rb
saviour-0.5.7 lib/saviour/url_source.rb
saviour-0.5.6 lib/saviour/url_source.rb
saviour-0.5.5 lib/saviour/url_source.rb
saviour-0.5.4 lib/saviour/url_source.rb
saviour-0.5.3 lib/saviour/url_source.rb