class DownloadRequest

Downloads a file to a specified folder.

Attributes

error[R]
file_size[R]
url[R]

Public Class Methods

get(*args) click to toggle source
# File lib/download_request.rb, line 10
def get(*args)
  new(*args).get
end
new(url, download_folder) click to toggle source
# File lib/download_request.rb, line 17
def initialize(url, download_folder)
  @url = URI.parse(url)
  # puts @url.path
  @http = Net::HTTP.new(@url.host, @url.port)
  if @url.scheme == "https"
    @http.use_ssl = true
    @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end
  @download_folder = download_folder
  @file_size = 0
end

Public Instance Methods

get() click to toggle source

Writes file segments to disk immediately instead of storing in memory

# File lib/download_request.rb, line 30
def get
  return unless @error.nil?

  dirname = File.dirname(@download_folder)
  unless File.directory?(dirname)
    FileUtils.mkdir_p(dirname)
  end

  local_file = ::File.open(@download_folder, "wb")
  partial = true
  @http.request_get(@url) do |response|
    case response.code
    when "200"
      response.read_body do |segment|
        local_file.write(segment)
      end
      @file_size = ::File.size(@download_folder)
      partial = false
    when "302"
      @error = "Token Not Authorized to Access Specified File"
    else
      @error = "#{response.code} #{response.class.name}"
    end
  end
rescue => e # Net::ReadTimeout, SocketError
  @error = "(#{e.class}) #{e.message}"
ensure
  local_file.close if local_file
  ::File.delete(@download_folder) if partial && ::File.exist?(@download_folder)
end