mirror of https://github.com/rails/rails
Merge pull request #15616 from apanzerj/fix_long_key_paths
fix error with long keys in ActiveSupport::Cache::FileStore
This commit is contained in:
commit
6cef56ffac
|
@ -1,3 +1,6 @@
|
|||
* 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 @@ module ActiveSupport
|
|||
|
||||
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 @@ module ActiveSupport
|
|||
|
||||
# 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 @@ class FileStoreTest < ActiveSupport::TestCase
|
|||
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)
|
||||
|
|
Loading…
Reference in New Issue