Module: Flexirest::Caching::ClassMethods

Defined in:
lib/flexirest/caching.rb

Constant Summary collapse

@@perform_caching =
true

Instance Method Summary collapse

Instance Method Details

#_reset_caching!Object



45
46
47
48
49
# File 'lib/flexirest/caching.rb', line 45

def _reset_caching!
  @@perform_caching = nil
  @perform_caching = nil
  @@cache_store = nil
end

#cache_storeObject



36
37
38
39
40
41
42
43
# File 'lib/flexirest/caching.rb', line 36

def cache_store
  rails_cache_store = if Object.const_defined?(:Rails)
    ::Rails.try(:cache)
  else
    nil
  end
  (@@cache_store rescue nil) || rails_cache_store
end

#cache_store=(value) ⇒ Object



28
29
30
31
32
33
34
# File 'lib/flexirest/caching.rb', line 28

def cache_store=(value)
  @@cache_store = nil if value.nil? and return
  raise InvalidCacheStoreException.new("Cache store does not implement #read") unless value.respond_to?(:read)
  raise InvalidCacheStoreException.new("Cache store does not implement #write") unless value.respond_to?(:write)
  raise InvalidCacheStoreException.new("Cache store does not implement #fetch") unless value.respond_to?(:fetch)
  @@cache_store = value
end

#perform_caching(value = nil) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/flexirest/caching.rb', line 6

def perform_caching(value = nil)
  @perform_caching = nil unless instance_variable_defined?(:@perform_caching)
  if value.nil?
    value = if @perform_caching.nil?
      @@perform_caching
    else
      @perform_caching
    end
    if value.nil? && superclass.respond_to?(:perform_caching)
      value = superclass.perform_caching
    end
    value
  else
    @perform_caching = value
  end
end

#perform_caching=(value) ⇒ Object



23
24
25
26
# File 'lib/flexirest/caching.rb', line 23

def perform_caching=(value)
  @@perform_caching = value
  @perform_caching = value
end

#read_cached_response(request, quiet) ⇒ Object



51
52
53
54
55
56
57
58
# File 'lib/flexirest/caching.rb', line 51

def read_cached_response(request, quiet)
  if cache_store && perform_caching && request.method[:method] == :get
    key = "#{request.class_name}:#{request.original_url}"
    Flexirest::Logger.debug "  \033[1;4;32m#{Flexirest.name}\033[0m #{key} - Trying to read from cache" unless quiet
    value = cache_store.read(key)
    value = Marshal.load(value) rescue value
  end
end

#write_cached_response(request, response, result, quiet) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/flexirest/caching.rb', line 60

def write_cached_response(request, response, result, quiet)
  return if result.is_a? Symbol
  return unless perform_caching
  return unless !result.respond_to?(:_status) || [200, 304].include?(result._status)
  headers = response.response_headers

  headers.keys.select{|h| h.is_a? String}.each do |key|
    headers[key.downcase.to_sym] = headers[key]
  end

  if cache_store && (headers[:etag] || headers[:expires])
    key = "#{request.class_name}:#{request.original_url}"
    Flexirest::Logger.debug "  \033[1;4;32m#{Flexirest.name}\033[0m #{key} - Writing to cache" unless quiet
    cached_response = CachedResponse.new(status:response.status, result:result, response_headers: headers)
    cached_response.etag = "#{headers[:etag]}" if headers[:etag]
    cached_response.expires = Time.parse(headers[:expires]) rescue nil if headers[:expires]
    if cached_response.etag.present? || cached_response.expires
      options = {}
      if cached_response.expires.present?
        exp_in_seconds = cached_response.expires.utc - Time.now.utc
        return unless exp_in_seconds.positive?

        options[:expires_in] = exp_in_seconds
      end
      cache_store.write(key, Marshal.dump(cached_response), options)
    end
  end
end