class FPM::Fry::Source::Archive::Cache

Public Class Methods

new(*_) click to toggle source
Calls superclass method
# File lib/fpm/fry/source/archive.rb, line 75
def initialize(*_)
  super
  if !checksum
    update!
  end
end

Public Instance Methods

cachekey() click to toggle source

@return [String] cachekey which is equal to the checksum

# File lib/fpm/fry/source/archive.rb, line 69
def cachekey
  @observed_checksum || checksum
end

Private Instance Methods

cache_valid?() click to toggle source
# File lib/fpm/fry/source/archive.rb, line 82
def cache_valid?
  c = @observed_checksum || checksum
  begin
    checksum_algorithm.file(tempfile).hexdigest == c
  rescue Errno::ENOENT
    return false
  end
end
fetch_url( url, redirs = 3, &block) click to toggle source
# File lib/fpm/fry/source/archive.rb, line 125
def fetch_url( url, redirs = 3, &block)
  url = URI(url.to_s) unless url.kind_of? URI
  Net::HTTP.get_response(url) do |resp|
    case(resp)
    when Net::HTTPRedirection
      if redirs == 0
        raise RedirectError.new("Too many redirects", url: url.to_s, location: resp['location'])
      end
      logger.debug("Following redirect", url: url.to_s , location: resp['location'])
      return fetch_url( resp['location'], redirs - 1, &block)
    when Net::HTTPSuccess
      return block.call( url, resp)
    else
      raise CacheFailed.new('Unable to fetch file',url: url.to_s, http_code: resp.code.to_i, http_message: resp.message)
    end
  end
end
tempfile() click to toggle source
# File lib/fpm/fry/source/archive.rb, line 143
def tempfile
  File.join(tempdir,File.basename(url.path))
end
update!() click to toggle source
# File lib/fpm/fry/source/archive.rb, line 91
def update!
  if cache_valid?
    logger.debug("Found valid cache", url: url, tempfile: tempfile)
    return
  end
  d = checksum_algorithm.new
  f = nil
  actual_url = url.to_s
  fetch_url(url) do | last_url, resp|
    actual_url = last_url.to_s
    begin
      f = File.new(tempfile,'w')
      resp.read_body do | chunk |
        d.update(chunk)
        f.write(chunk)
      end
    rescue => e
      raise CacheFailed, e
    ensure
      f.close
    end
  end

  @observed_checksum = d.hexdigest
  logger.debug("Got checksum", checksum: @observed_checksum, url: actual_url)
  if checksum
    if d.hexdigest != checksum
      raise CacheFailed.new("Checksum failed",given: d.hexdigest, expected: checksum, url: actual_url)
    end
  else
    return true
  end
end