class Chef::Provider::RemoteFile::CacheControlData

CacheControlData

Implements per-uri storage of cache control data for a remote resource along with a sanity check checksum of the file in question. Provider::RemoteFile protocol implementation classes can use this information to avoid re-fetching files when the current copy is up to date. The way this information is used is protocol-dependent. For HTTP, this information is sent to the origin server via headers to make a conditional GET request.

API

The general shape of the API is active-record-the-pattern-like. New instances should be instantiated via `CacheControlData.load_and_validate`, which will do a find-or-create operation and then sanity check the data against the checksum of the current copy of the file. If there is no data or the sanity check fails, the `etag` and `mtime` attributes will be set to nil; otherwise they are populated with the previously saved values.

After fetching a file, the CacheControlData instance should be updated with new etag, mtime and checksum values in whatever format is preferred by the protocol used. Then call save to save the data to disk.

Attributes

checksum[RW]

SHA2-256 Hash of the file as last fetched.

mtime[RW]

Last modified time of the remote resource. Different protocols will use different types for this field (e.g., string representation of a specific date format, integer, etc.) For HTTP-specific references, see:

uri[R]

URI of the resource as a String. This is the “primary key” used for storage and retrieval.

Public Class Methods

load_and_validate(uri, current_copy_checksum) click to toggle source
# File lib/chef/provider/remote_file/cache_control_data.rb, line 55
def self.load_and_validate(uri, current_copy_checksum)
  ccdata = new(uri)
  ccdata.load
  ccdata.validate!(current_copy_checksum)
  ccdata
end
new(uri) click to toggle source
# File lib/chef/provider/remote_file/cache_control_data.rb, line 83
def initialize(uri)
  uri = uri.dup
  uri.password = "XXXX" unless uri.userinfo.nil?
  @uri = uri.to_s
end

Public Instance Methods

load() click to toggle source
# File lib/chef/provider/remote_file/cache_control_data.rb, line 89
def load
  if previous_cc_data = load_data
    apply(previous_cc_data)
    self
  else
    false
  end
end
save() click to toggle source

Saves the data to disk using Chef::FileCache. The filename is a sanitized version of the URI with a MD5 of the same URI appended (to avoid collisions between different URIs having the same sanitized form).

# File lib/chef/provider/remote_file/cache_control_data.rb, line 111
def save
  Chef::FileCache.store("remote_file/#{sanitized_cache_file_basename}", json_data)
end
validate!(current_copy_checksum) click to toggle source
# File lib/chef/provider/remote_file/cache_control_data.rb, line 98
def validate!(current_copy_checksum)
  if current_copy_checksum.nil? or checksum != current_copy_checksum
    reset!
    false
  else
    true
  end
end