Class: Cloudkeeper::Aws::ImageDownloader

Inherits:
Object
  • Object
show all
Defined in:
lib/cloudkeeper/aws/image_downloader.rb

Overview

Class used for downloading images for cloudkeeper

Class Method Summary collapse

Class Method Details

.download(image_uri, username = nil, password = nil, limit = 10) {|segment| ... } ⇒ Object

Downloads file from uri by segments

Parameters:

  • image_uri (String)

    uri of the image to download

  • username (String) (defaults to: nil)

    authentication username

  • password (String) (defaults to: nil)

    authentication password

  • limit (Number) (defaults to: 10)

    redirect limit to handle redirect infinite loops

Yields:

  • (segment)

    data segment

Raises:

  • (Cloudkeeper::Aws:Errors::ImageDownloadError)

    if download failed



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/cloudkeeper/aws/image_downloader.rb', line 15

def self.download(image_uri, username = nil, password = nil, limit = 10, &block)
  raise Cloudkeeper::Aws::Errors::ImageDownloadError, 'Too many redirects' \
    if limit.zero?

  uri = URI.parse(image_uri)
  Net::HTTP.start(uri.host, uri.port) do |http|
    request = Net::HTTP::Get.new(uri)
    request.basic_auth username, password
    http.request(request) do |resp|
      handle_response(resp, username, password, limit, &block)
    end
  end
rescue URI::InvalidURIError => e
  raise Cloudkeeper::Aws::Errors::ImageDownloadError, e.message
end

.handle_response(resp, username, password, limit) {|segment| ... } ⇒ Object

Method used for handeling responses from download requests. It handles redirects as well as failures.

Parameters:

  • resp (HTTP::Response)

    response to handle

  • username (String)

    authentication username

  • password (String)

    authentication password

  • limit (Number)

    redirect limit

Yields:

  • (segment)

    data segment



39
40
41
42
43
44
45
46
47
48
49
# File 'lib/cloudkeeper/aws/image_downloader.rb', line 39

def self.handle_response(resp, username, password, limit, &block)
  case resp
  when Net::HTTPRedirection then
    download(resp['location'], username, password, limit - 1, &block)
  when Net::HTTPSuccess then
    resp.read_body(&block)
  else
    raise Cloudkeeper::Aws::Errors::ImageDownloadError,
          'Failed to download image'
  end
end