Sha256: f54705010f4ee672a5d512e39d55e65ee6fa88f37eb480d72a15448de0a0b121

Contents?: true

Size: 1.84 KB

Versions: 2

Compression:

Stored size: 1.84 KB

Contents

require 'net/http'
require 'openssl'
require 'uri'

module PKGWizard

  #
  # StreamingDownloader code based on HTTPDownloader
  # code from http://www.vagrantup.com
  #
  class StreamingDownloader
    def self.match?(uri)
      # URI.parse barfs on '<drive letter>:\\files \on\ windows'
      extracted = URI.extract(uri).first
      extracted && extracted.include?(uri)
    end

    def report_progress(progress, total, show_parts=true)
      line_reset = "\r\e[0K" 
      percent = (progress.to_f / total.to_f) * 100
      line = "Progress: #{percent.to_i}%"
      line << " (#{progress} / #{total})" if show_parts
      line = "#{line_reset}#{line}"
      $stdout.sync = true
      $stdout.print line
    end

    def download!(source_url, destination_file)
      proxy_uri = URI.parse(ENV["http_proxy"] || "")
      uri = URI.parse(source_url)
      http = Net::HTTP.new(uri.host, uri.port, proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password)

      if uri.scheme == "https"
        http.use_ssl = true
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
      end

      http.start do |h|
        h.request_get(uri.request_uri) do |response|
          total = response.content_length
          progress = 0
          segment_count = 0

          response.read_body do |segment|
            # Report the progress out
            progress += segment.length
            segment_count += 1

            # Progress reporting is limited to every 25 segments just so
            # we're not constantly updating
            if segment_count % 25 == 0
              report_progress(progress, total)
              segment_count = 0
            end


            # Store the segment
            destination_file.write(segment)
          end
        end
      end
      puts
      rescue SocketError
        raise Errors::DownloaderHTTPSocketError.new
      end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
pkg-wizard-0.1.29 lib/pkg-wizard/streaming_downloader.rb
pkg-wizard-0.1.28 lib/pkg-wizard/streaming_downloader.rb