Sha256: 211025c326a6c030751496b6a279cdc0dcaaed185011acce97c483ee447b0c92

Contents?: true

Size: 1.28 KB

Versions: 6

Compression:

Stored size: 1.28 KB

Contents

# encoding: utf-8

require 'uri'
require 'net/http'

module TTY
  module File
    DownloadError = Class.new(StandardError)

    class DownloadFile
      attr_reader :uri, :dest_path, :limit

      DEFAULT_REDIRECTS = 3

      # @options
      #
      def initialize(url, dest_path, options = {})
        @uri       = URI.parse(url)
        @dest_path = dest_path
        @limit     = options.fetch(:limit) { DEFAULT_REDIRECTS }
      end

      # Download a file
      #
      # @api public
      def call
        download(uri, dest_path, limit)
      end

      private

      # @api private
      def download(uri, path, limit)
        raise DownloadError, 'Redirect limit reached!' if limit.zero?
        content = ''

        Net::HTTP.start(uri.host, uri.port,
                        use_ssl: uri.scheme == 'https') do |http|
          http.request_get(uri.path) do |response|
            case response
            when Net::HTTPSuccess
              response.read_body do |seg|
                content << seg
              end
            when Net::HTTPRedirection
              download(URI.parse(response['location']), path, limit - 1)
            else
              response.error!
            end
          end
        end
        content
      end
    end # DownloadFile
  end # File
end # TTY

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
tty-file-0.5.0 lib/tty/file/download_file.rb
tty-file-0.4.0 lib/tty/file/download_file.rb
tty-file-0.3.0 lib/tty/file/download_file.rb
tty-file-0.2.1 lib/tty/file/download_file.rb
tty-file-0.2.0 lib/tty/file/download_file.rb
tty-file-0.1.0 lib/tty/file/download_file.rb