Class: ZendeskAPI::Middleware::Request::EtagCache
- Inherits:
- 
      Faraday::Middleware
      
        - Object
- Faraday::Middleware
- ZendeskAPI::Middleware::Request::EtagCache
 
- 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
- #cache_key(env) ⇒ Object
- #call(environment) ⇒ Object
- 
  
    
      #initialize(app, options = {})  ⇒ EtagCache 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of EtagCache. 
Constructor Details
#initialize(app, options = {}) ⇒ EtagCache
Returns a new instance of EtagCache.
| 10 11 12 13 14 15 | # File 'lib/zendesk_api/middleware/request/etag_cache.rb', line 10 def initialize(app, = {}) @app = app @cache = [:cache] || raise("need :cache option e.g. ActiveSupport::Cache::MemoryStore.new") @cache_key_prefix = .fetch(:cache_key_prefix, :faraday_etags) end | 
Instance Method Details
#cache_key(env) ⇒ Object
| 17 18 19 | # File 'lib/zendesk_api/middleware/request/etag_cache.rb', line 17 def cache_key(env) [@cache_key_prefix, env[:url].to_s] end | 
#call(environment) ⇒ Object
| 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | # File 'lib/zendesk_api/middleware/request/etag_cache.rb', line 21 def call(environment) return @app.call(environment) unless [:get, :head].include?(environment[:method]) # send known etag cached = @cache.read(cache_key(environment)) if cached environment[:request_headers]["If-None-Match"] ||= cached[:response_headers]["Etag"] end @app.call(environment).on_complete do |env| if cached && env[:status] == 304 # not modified # Handle differences in serialized env keys in Faraday < 1.0 and 1.0 # See https://github.com/lostisland/faraday/pull/847 env[:body] = cached[:body] env[:response_body] = cached[:response_body] env[:response_headers].merge!( :etag => cached[:response_headers][:etag], :content_type => cached[:response_headers][:content_type], :content_length => cached[:response_headers][:content_length], :content_encoding => cached[:response_headers][:content_encoding] ) elsif env[:status] == 200 && env[:response_headers]["Etag"] # modified and cacheable @cache.write(cache_key(env), env.to_hash) end end end |