提交 6cef56ff 编写于 作者: R Rafael Mendonça França

Merge pull request #15616 from apanzerj/fix_long_key_paths

fix error with long keys in ActiveSupport::Cache::FileStore
* Fixed `ActiveSupport::Cache::FileStore` exploding with long paths.
*Adam Panzer / Michael Grosser*
* Fixed `ActiveSupport::TimeWithZone#-` so precision is not unnecessarily lost
when working with objects with a nanosecond component.
......
......@@ -14,6 +14,7 @@ class FileStore < Store
DIR_FORMATTER = "%03X"
FILENAME_MAX_SIZE = 228 # max filename size on file system is 255, minus room for timestamp and random characters appended by Tempfile (used by atomic write)
FILEPATH_MAX_SIZE = 900 # max is 1024, plus some room
EXCLUDED_DIRS = ['.', '..'].freeze
def initialize(cache_path, options = nil)
......@@ -117,6 +118,10 @@ def lock_file(file_name, &block) # :nodoc:
# Translate a key into a file path.
def key_file_path(key)
if key.size > FILEPATH_MAX_SIZE
key = Digest::MD5.hexdigest(key)
end
fname = URI.encode_www_form_component(key)
hash = Zlib.adler32(fname)
hash, dir_1 = hash.divmod(0x1000)
......
......@@ -692,6 +692,11 @@ def test_clear
assert File.exist?(filepath)
end
def test_long_keys
@cache.write("a"*10000, 1)
assert_equal 1, @cache.read("a"*10000)
end
def test_key_transformation
key = @cache.send(:key_file_path, "views/index?id=1")
assert_equal "views/index?id=1", @cache.send(:file_path_key, key)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册