Fix Caching Bug

Files with "+"s in their names (e.g. from Wiki pages with spaces in their names) were not being expired properly. This is actually a Rails bug, but I fixed it by patching the action_cache plugin.
This commit is contained in:
Jacques Distler 2007-06-15 09:18:06 -05:00
parent 3de374d6c1
commit 31f691329a

View file

@ -7,6 +7,28 @@ module ActionController
end end
module Caching module Caching
##Fix one method which seems to be broken
module Fragments
def expire_fragment(name, options = nil)
return unless perform_caching
key = fragment_cache_key(name)
if key.is_a?(Regexp)
#need this next line, otherwise filenames with '+'s in them fail
key = Regexp.new(Regexp.escape(key.source).gsub(/\\\.\\\*/, '.*'))
self.class.benchmark "Expired fragments matching: #{key.source}" do
fragment_cache_store.delete_matched(key, options)
end
else
self.class.benchmark "Expired fragment: #{key}" do
fragment_cache_store.delete(key, options)
end
end
end
end
#####
module Actions module Actions
# All documentation is keeping DRY in the plugin's README # All documentation is keeping DRY in the plugin's README
@ -134,7 +156,7 @@ module ActionController
controller.response.headers['Cache-Control'] == 'no-cache' controller.response.headers['Cache-Control'] == 'no-cache'
controller.response.headers['Cache-Control'] = "max-age=#{controller.response.time_to_live}" controller.response.headers['Cache-Control'] = "max-age=#{controller.response.time_to_live}"
end end
controller.response.headers['Etag'] = "\"#{MD5.new(controller.response.body).to_s}\"" controller.response.headers['Etag'] = %{"#{MD5.new(controller.response.body).to_s}"}
controller.response.headers['Last-Modified'] ||= Time.now.httpdate controller.response.headers['Last-Modified'] ||= Time.now.httpdate
end end
@ -147,7 +169,7 @@ module ActionController
def send_not_modified(controller) def send_not_modified(controller)
controller.logger.info "Send Not Modified" controller.logger.info "Send Not Modified"
controller.response.headers['Etag'] = "\"#{MD5.new(fragment_body(controller)).to_s}\"" controller.response.headers['Etag'] = %{"#{MD5.new(fragment_body(controller)).to_s}"}
controller.render(:text => "", :status => 304) controller.render(:text => "", :status => 304)
end end