Class: Chef::Provider::RemoteFile::CacheControlData

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/provider/remote_file/cache_control_data.rb

Overview

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uri) ⇒ CacheControlData

Returns a new instance of CacheControlData


83
84
85
86
87
# 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

Instance Attribute Details

#checksumObject

SHA2-256 Hash of the file as last fetched.


77
78
79
# File 'lib/chef/provider/remote_file/cache_control_data.rb', line 77

def checksum
  @checksum
end

#etagObject


65
66
67
# File 'lib/chef/provider/remote_file/cache_control_data.rb', line 65

def etag
  @etag
end

#mtimeObject

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:


74
75
76
# File 'lib/chef/provider/remote_file/cache_control_data.rb', line 74

def mtime
  @mtime
end

#uriObject (readonly)

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


81
82
83
# File 'lib/chef/provider/remote_file/cache_control_data.rb', line 81

def uri
  @uri
end

Class Method Details

.load_and_validate(uri, current_copy_checksum) ⇒ Object


55
56
57
58
59
60
# 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

Instance Method Details

#json_dataObject

:nodoc: JSON representation of this object for storage.


117
118
119
# File 'lib/chef/provider/remote_file/cache_control_data.rb', line 117

def json_data
  Chef::JSONCompat.to_json(hash_data)
end

#loadObject


89
90
91
92
93
94
95
96
# 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

#saveObject

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


111
112
113
# 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) ⇒ Object


98
99
100
101
102
103
104
105
# File 'lib/chef/provider/remote_file/cache_control_data.rb', line 98

def validate!(current_copy_checksum)
  if current_copy_checksum.nil? || checksum != current_copy_checksum
    reset!
    false
  else
    true
  end
end