class FaradayMiddleware::Caching
Public: Caches GET responses and pulls subsequent ones from the cache.
Constants
- CACHEABLE_STATUS_CODES
Internal: List of status codes that can be cached:
-
200 - 'OK'
-
203 - 'Non-Authoritative Information'
-
300 - 'Multiple Choices'
-
301 - 'Moved Permanently'
-
302 - 'Found'
-
404 - 'Not Found'
-
410 - 'Gone'
-
Attributes
cache[R]
Public Class Methods
new(app, cache = nil, options = {}) { || ... }
click to toggle source
Public: initialize the middleware.
cache - An object that responds to read, write and fetch (default: nil). options - An options Hash (default: {}):
:ignore_params - String name or Array names of query params that should be ignored when forming the cache key (default: []). :write_options - Hash of settings that should be passed as the third options parameter to the cache's #write method. If not specified, no options parameter will be passed.
Yields if no cache is given. The block should return a cache object.
Calls superclass method
# File lib/faraday_middleware/response/caching.rb, line 35 def initialize(app, cache = nil, options = {}) super(app) options, cache = cache, nil if cache.is_a? Hash and block_given? @cache = cache || yield @options = options end
Public Instance Methods
cache_key(env)
click to toggle source
# File lib/faraday_middleware/response/caching.rb, line 61 def cache_key(env) url = env[:url].dup if url.query && params_to_ignore.any? params = parse_query url.query params.reject! {|k,| params_to_ignore.include? k } url.query = params.any? ? build_query(params) : nil end url.normalize! url.request_uri end
cache_on_complete(env)
click to toggle source
# File lib/faraday_middleware/response/caching.rb, line 76 def cache_on_complete(env) key = cache_key(env) if cached_response = cache.read(key) finalize_response(cached_response, env) else # response.status is nil at this point, any checks need to be done inside on_complete block @app.call(env).on_complete do |response_env| store_response_in_cache(key, response_env.response) response_env end end end
call(env)
click to toggle source
# File lib/faraday_middleware/response/caching.rb, line 42 def call(env) if :get == env[:method] if env[:parallel_manager] # callback mode cache_on_complete(env) else # synchronous mode key = cache_key(env) unless response = cache.read(key) and response response = @app.call(env) store_response_in_cache(key, response) end finalize_response(response, env) end else @app.call(env) end end
finalize_response(response, env)
click to toggle source
# File lib/faraday_middleware/response/caching.rb, line 99 def finalize_response(response, env) response = response.dup if response.frozen? env[:response] = response unless env[:response_headers] env.update response.env # FIXME: omg hax response.instance_variable_set('@env', env) end response end
params_to_ignore()
click to toggle source
# File lib/faraday_middleware/response/caching.rb, line 72 def params_to_ignore @params_to_ignore ||= Array(@options[:ignore_params]).map { |p| p.to_s } end
store_response_in_cache(key, response)
click to toggle source
# File lib/faraday_middleware/response/caching.rb, line 89 def store_response_in_cache(key, response) return unless CACHEABLE_STATUS_CODES.include?(response.status) if @options[:write_options] cache.write(key, response, @options[:write_options]) else cache.write(key, response) end end