Class: ZendeskAPI::Middleware::Request::EtagCache

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/zendesk_api/middleware/request/etag_cache.rb

Overview

Request middleware that caches responses based on etags can be removed once this is merged: github.com/pengwynn/faraday_middleware/pull/42

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ EtagCache

Returns a new instance of EtagCache.



9
10
11
12
13
14
# File 'lib/zendesk_api/middleware/request/etag_cache.rb', line 9

def initialize(app, options = {})
  @app = app
  @cache = options[:cache] ||
    raise("need :cache option e.g. ActiveSupport::Cache::MemoryStore.new")
  @cache_key_prefix = options.fetch(:cache_key_prefix, :faraday_etags)
end

Instance Method Details

#call(env) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/zendesk_api/middleware/request/etag_cache.rb', line 16

def call(env)
  return @app.call(env) unless [:get, :head].include?(env[:method])
  cache_key = [@cache_key_prefix, env[:url].to_s]

  # send known etag
  if cached = @cache.read(cache_key)
    env[:request_headers]["If-None-Match"] ||= cached[:response_headers]["Etag"]
  end

  @app.call(env).on_complete do
    if cached && env[:status] == 304 # not modified
      env[:body] = cached[:body]
    end

    if env[:status] == 200 && env[:response_headers]["Etag"] # modified and cacheable
      @cache.write(cache_key, env)
    end
  end
end