Sha256: 7bda0e4a8173a96e5eb2d01e90e913c397592b229d349fa21f95c9be98d01901

Contents?: true

Size: 1.22 KB

Versions: 3

Compression:

Stored size: 1.22 KB

Contents

require 'net/http'
require 'openssl'

module DownloadUtils
  def stream_download(source, chunk_size = 5_242_880)
    url = URI.parse(source)
    http, req = setup_connection(url)

    content_length = http.request_head(url).content_length
    upper_limit = content_length + (content_length % chunk_size)
    offset = 0

    http.start do |agent|
      while offset < upper_limit
        lim = (offset + chunk_size)
        # QUESTION: is it relevant to set the last chunk
        # to the exact remaining bytes
        # lim = content_length if lim > content_length
        req.range = (offset..lim)

        chunk = agent.request(req).body
        yield chunk.force_encoding(Encoding::BINARY)

        offset += chunk_size + 1
      end
    end
  end

  def download_range(source, range)
    url = URI.parse(source)
    http, req = setup_connection(url)
    req.range = range

    chunk = http.start { |agent| agent.request(req).body }
    chunk.force_encoding(Encoding::BINARY)
  end

  private

  def setup_connection(url)
    http = Net::HTTP.new(url.host, url.port)
    req = Net::HTTP::Get.new(url.request_uri)

    if url.port == 443
      http.use_ssl = true
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    end
    [http, req]
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
activestorage-cloudinary-service-0.2.3 lib/active_storage/service/download_utils.rb
activestorage-cloudinary-service-0.2.2 lib/active_storage/service/download_utils.rb
activestorage-cloudinary-service-0.2.0 lib/active_storage/service/download_utils.rb