Skip to content

Commit

Permalink
Merge pull request #14171 from arthurnn/extract_middleware_cache
Browse files Browse the repository at this point in the history
Extract local cache middleware
  • Loading branch information
guilleiguaran committed Feb 24, 2014
2 parents 2403869 + cb172db commit 4d24c15
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 32 deletions.
34 changes: 2 additions & 32 deletions activesupport/lib/active_support/cache/strategy/local_cache.rb
@@ -1,6 +1,5 @@
require 'active_support/core_ext/object/duplicable'
require 'active_support/core_ext/string/inflections'
require 'rack/body_proxy'

module ActiveSupport
module Cache
Expand All @@ -9,6 +8,8 @@ module Strategy
# duration of a block. Repeated calls to the cache for the same key will hit the
# in-memory cache for faster access.
module LocalCache
autoload :Middleware, 'active_support/cache/strategy/local_cache_middleware'

# Class for storing and registering the local caches.
class LocalCacheRegistry # :nodoc:
extend ActiveSupport::PerThreadRegistry
Expand Down Expand Up @@ -64,37 +65,6 @@ def delete_entry(key, options)
def with_local_cache
use_temporary_local_cache(LocalStore.new) { yield }
end

#--
# This class wraps up local storage for middlewares. Only the middleware method should
# construct them.
class Middleware # :nodoc:
attr_reader :name, :local_cache_key

def initialize(name, local_cache_key)
@name = name
@local_cache_key = local_cache_key
@app = nil
end

def new(app)
@app = app
self
end

def call(env)
LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
end
response
rescue Exception
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
raise
end
end

# Middleware class can be inserted as a Rack handler to be local cache for the
# duration of request.
def middleware
Expand Down
@@ -0,0 +1,39 @@
require 'rack/body_proxy'
module ActiveSupport
module Cache
module Strategy
module LocalCache

#--
# This class wraps up local storage for middlewares. Only the middleware method should
# construct them.
class Middleware # :nodoc:
attr_reader :name, :local_cache_key

def initialize(name, local_cache_key)
@name = name
@local_cache_key = local_cache_key
@app = nil
end

def new(app)
@app = app
self
end

def call(env)
LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
end
response
rescue Exception
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
raise
end
end
end
end
end
end

0 comments on commit 4d24c15

Please sign in to comment.