Sha256: 34e1e065d7ee6bc04432aed3084412654c6212f759ffb3c7de99d02641a647a3

Contents?: true

Size: 1.91 KB

Versions: 27

Compression:

Stored size: 1.91 KB

Contents

require "faraday/middleware"

module ZendeskAPI
  module Middleware
    module Request
      # Request middleware that caches responses based on etags
      # can be removed once this is merged: https://github.com/pengwynn/faraday_middleware/pull/42
      # @private
      class EtagCache < Faraday::Middleware
        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

        def cache_key(env)
          [@cache_key_prefix, env[:url].to_s]
        end

        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
      end
    end
  end
end

Version data entries

27 entries across 27 versions & 2 rubygems

Version Path
zendesk_api-3.1.1 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-3.1.0 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-3.0.5 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-3.0.4 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-3.0.2 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-3.0.1 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-3.0.0 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-3.0.0.rc1 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-2.0.1 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-2.0.0 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-1.38.0.rc2 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-1.38.0.rc1 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-1.37.0 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-1.36.0 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-1.35.0 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-1.34.0 lib/zendesk_api/middleware/request/etag_cache.rb
discourse_zendesk_api-1.0.1 lib/zendesk_api/middleware/request/etag_cache.rb
discourse_zendesk_api-1.0.0 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-1.33.0 lib/zendesk_api/middleware/request/etag_cache.rb
zendesk_api-1.32.0 lib/zendesk_api/middleware/request/etag_cache.rb