# Rack-cache 0.3.0

**URL:** <https://www.ruby-forum.com/t/rack-cache-0-3-0/156521>\
**Category:** Ruby\
**Created:** [December 29, 2008, 12:14pm UTC](https://www.ruby-forum.com/t/rack-cache-0-3-0/156521 "2008-12-29T12:14:55Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![ryantate](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e56c9b/32.png) [@ryantate](https://www.ruby-forum.com/u/ryantate)\
**Post date:** [December 29, 2008, 12:14pm UTC](https://www.ruby-forum.com/t/rack-cache-0-3-0/156521/1 "2008-12-29T12:14:55Z")

</div>

rack-cache 0.3.0 is now available. This release corrects some nasty  
bugs and adds support for a variety of important HTTP caching features.

[http://tomayko.com/src/rack-cache/](http://tomayko.com/src/rack-cache/)

> **[GitHub - rtomayko/rack-cache: Real HTTP Caching for Ruby Web Apps](https://github.com/rtomayko/rack-cache/)**
>
> Real HTTP Caching for Ruby Web Apps. Contribute to rtomayko/rack-cache development by creating an account on GitHub.

From the CHANGES file:

- Add support for public and private cache control directives.  
Responses marked as explicitly public are cached even when the  
request includes an Authorization or Cookie header. Responses  
marked as explicitly private are considered uncacheable.

- Added a “private\_headers” option that dictates which request  
headers trigger default “private” cache control processing. By  
default, the Cookie and Authorization headers are included.  
Headers may be added or removed as necessary to change the  
default private logic.

- Adhere to must-revalidate/proxy-revalidate cache control  
directives by not assigning the default\_ttl to responses that  
don’t include freshness information. This should let us begin  
using default\_ttl more liberally since we can control it using  
the must-revalidate/proxy-revalidate directives.

- Use the s-maxage Cache-Control value in preference to max-age  
when present. The ttl= method now sets the s-maxage value instead  
of max-age. Code that used ttl= to control freshness at the  
client needs to change to set the max-age directive explicitly.

- Enable support for X-Sendfile middleware by responding to  
#to\_path on bodies served from disk storage. Adding the  
Rack::Sendfile component upstream from Rack::Cache will result in  
cached bodies being served directly by the web server (instead of  
being read in Ruby).

- BUG: MetaStore hits but EntityStore misses. This would 500  
previously; now we detect it and act as if the MetaStore missed  
as well.

- Implement low level #purge method on all concrete entity store  
classes – removes the entity body corresponding to the SHA1 key  
provided and returns nil.

- Basically sane handling of HEAD requests. A HEAD request is  
never passed through to the backend except when transitioning  
with pass!. This means that the cache responds to HEAD requests  
without invoking the backend at all when the cached entry is  
fresh. When no cache entry exists, or the cached entry is stale  
and can be validated, the backend is invoked with a GET request  
and the HEAD is handled right before the response is delivered  
upstream.

- BUG: The Age response header was not being set properly when a  
stale entry was validated. This would result in Age values that  
exceeded the freshness lifetime in responses.

- BUG: A cached entry in a heap meta store could be  
unintentionally modified by request processing since the cached  
objects were being returned directly. The result was typically  
missing/incorrect header values (e.g., missing Content-Type  
header). [dkubb]

- BUG: 304 responses should not include entity headers  
(especially Content-Length). This is causing Safari/WebKit  
weirdness on 304 responses.

- BUG: The If-None-Match header was being ignored, causing the  
cache to send 200 responses to matching conditional GET requests.

Thanks,  
Ryan
