mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #14171 from arthurnn/extract_middleware_cache
Extract local cache middleware
This commit is contained in:
commit
4d24c150ab
2 changed files with 41 additions and 32 deletions
|
@ -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
|
||||
|
@ -9,6 +8,8 @@ module ActiveSupport
|
|||
# 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
|
||||
|
@ -64,37 +65,6 @@ module ActiveSupport
|
|||
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
|
||||
|
|
39
activesupport/lib/active_support/cache/strategy/local_cache_middleware.rb
vendored
Normal file
39
activesupport/lib/active_support/cache/strategy/local_cache_middleware.rb
vendored
Normal file
|
@ -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
|
Loading…
Reference in a new issue