You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@couchdb.apache.org by "Alexander Shorin (JIRA)" <ji...@apache.org> on 2013/07/02 01:35:20 UTC

[jira] [Updated] (COUCHDB-1422) Let _show/_list functions prevent caching

     [ https://issues.apache.org/jira/browse/COUCHDB-1422?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Alexander Shorin updated COUCHDB-1422:
--------------------------------------

    Component/s: View Server Support
                 HTTP Interface
    
> Let _show/_list functions prevent caching
> -----------------------------------------
>
>                 Key: COUCHDB-1422
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-1422
>             Project: CouchDB
>          Issue Type: Bug
>          Components: HTTP Interface, View Server Support
>            Reporter: Nathan Vander Wilt
>            Assignee: Robert Newson
>            Priority: Minor
>
> While CouchDB's automatic ETag handling on Show/List functions is desirable 95% of the time, I keep running into situations where I want to do something handy in a documentless show function ("if all you have is a hammer...") but end up getting into trouble with cached responses.
> I think the most straightforward fix is to send along any ETag header in a viewserver response instead of the default. Currently, instead of *overriding* the ETag header, the two headers are combined. This does "bust the cache" in some browsers if the only attempt to revalidate the first one (which happens to be that of the show function), but Firefox at least sends both back and CouchDB finds its match and responds with 304 "Not Modified". Letting a show/list function return a single garbage ETag would let it avoid having its result considered so strongly valid later.
> Consider my stupid simple little public IP address reflector (https://github.com/natevw/ipcalf/blob/master/shows/address.js) or the following show:
>     function (doc, req) {
>         return "Now is " + Date() + " and here is a unique identifier " + req.uuid + " which might have more entropy than " + Math.random();
>     }
> There are a lot of interesting/fun things that are well within JavaScript's reach in a (practically) side-effect free formatting function: different stylesheet based on user agent, SVG chart of DB stats in req.info, random quote generator... None of these are practical if the response will quickly end up locked by a cache — potentially in proxies well upstream of the client — based on an overly narrow definition (and IMO sometimes needless requirement) of idempotence.
> Letting the show function "bust the cache" by providing a response ETag which CouchDB won't re-validate would be a simple way to avoid this. With my proposal above, my IP address example would simply override the ETag and avoid 304-effects altogether:
>     function (doc, req) {
>         return {headers:{ETag:'"'+req.uuid+'"'}, body: "Your IP address is: " + req.peer};
>     }
> [If such a function wanted to allow for some caching benefit, it could provide an appropriate Expires header instead.]

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira