Skip to content

Instantly share code, notes, and snippets.

@jsierles
Created March 31, 2009 12:16
Show Gist options
  • Save jsierles/88167 to your computer and use it in GitHub Desktop.
Save jsierles/88167 to your computer and use it in GitHub Desktop.
class MemcachedPageCaching
CACHE_HEADER = "X-Cache".freeze
IGNORED_HEADERS = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Transfer-Encoding', 'Upgrade', 'Set-Cookie'].freeze
def initialize(app, *addresses)
@app = app
@cache = Rails.cache
@logger = Rails.logger
@logger.info "Initialized MemcachePagecache middleware"
freeze
end
def call(env)
req = Rack::Request.new(env)
req_path = ActionController::Base.relative_url_root + req.path_info
if resp = @cache.read(req_path)
@logger.debug "Serving #{req.fullpath} from memcached"
resp
else
status, headers, body = @app.call(env)
if status == 200 && headers.include?(CACHE_HEADER)
headers.delete(CACHE_HEADER)
headers.keys.each { |h| headers.delete(h) if IGNORED_HEADERS.include?(h) }
buffer = ""
body.each { |part| buffer << part }
resp = [status, headers, buffer]
@cache.write(req_path, resp)
resp
else
[status, headers, body]
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment