Sha256: 88c6fb3ff6746d61768abcdfdd48c6988d764201cb566458c96b6ce2cc213da3

Contents?: true

Size: 1.3 KB

Versions: 3

Compression:

Stored size: 1.3 KB

Contents

# frozen_string_literal: true

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.request_uri) 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.join
      end
    end # DownloadFile
  end # File
end # TTY

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
tty-file-0.8.0 lib/tty/file/download_file.rb
tty-file-0.7.1 lib/tty/file/download_file.rb
tty-file-0.7.0 lib/tty/file/download_file.rb