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?

List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/

Reply via email to