[Catalyst] A plugin for handling If-Modified-Since?

Robert Rothenberg robrwo at gmail.com
Wed Dec 5 15:48:57 GMT 2012

I'm working on a RESTful API for an application (much thanks for
Catalyst::Controller::REST, by the way) and need to handle the
If-Modified-Since header to efficiently check when things have changed.

It seems my controllers will follow the pattern:

  1. Initial validation of the request and get the base object that
     the request is about.

  2. Check for If-Modified-Since header.

     If it is present and no older than the last-modified date of
     the object, return a 304 status with no body.

  3. Otherwise, set the Last-modified and Expires headers. (The latter
     to keep Firefox from caching the result too long.)

  4. If a HEAD request, exit.

     Otherwise return the object, which involves some more reads from the
     database etc.

I've looked at the Cache::HTTP plugin, but it doesn't do what I want, which
is to pre-empt running queries if they don't need to be run.

Is there another plugin for doing this sort of thing?

If not, I am thinking of writing a plugin that would work something like

  $c->if_unmodified( headers => $sub1, content => $sub2 );

where $sub1 would be code to set the last-modified and maybe weak etags
(based on the last-modified if nothing else is specified).

The method would check for a If-Match and If-Modified-Since headers, etc. If
they matched, it would return a 304 error, otherwise it would run $sub2.

Does this seem a worthwhile endeavor?

More information about the Catalyst mailing list