# 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.

etag[RW]

Entity Tag of the resource. HTTP-specific. See also: www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.2 www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19

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:

- www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3

- www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.1

- www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25

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