[Cosmo-dev] Bug 9715
Travis Vachon
travis at osafoundation.org
Tue Oct 16 17:08:34 PDT 2007
Good news everyone!
After digging through the HTTP caching spec a bit (http://www.w3.org/
Protocols/rfc2616/rfc2616-sec13.html#sec13) I think that Firefox is
actually behaving correctly in most of the cases where we're seeing
bug 9715. From the spec:
"The goal of caching in HTTP/1.1 is to eliminate the need to send
requests in many cases, and to eliminate the need to send full
responses in many other cases."
The problem we're having is that Firefox is deciding that it does not
need to send a request to get calendar and dashboard data in many cases.
More spec:
13.1.1 Cache Correctness
A correct cache MUST respond to a request with the most up-to-date
response held by the cache that is appropriate to the request (see
sections 13.2.5, 13.2.6, and 13.12) which meets one of the following
conditions:
...
2. It is "fresh enough" (see section 13.2). In the default case,
this means it meets the least restrictive freshness
requirement
of the client, origin server, and cache (see section 14.9); if
the origin server so specifies, it is the freshness
requirement
of the origin server alone.
...
13.2 Expiration Model
13.2.1 Server-Specified Expiration
HTTP caching works best when caches can entirely avoid making
requests to the origin server.
...
13.2.2 Heuristic Expiration
Since origin servers do not always provide explicit expiration times,
HTTP caches typically assign heuristic expiration times, employing
algorithms that use other header values (such as the Last-Modified
time) to estimate a plausible expiration time. The HTTP/1.1
specification does not provide specific algorithms, but does impose
worst-case constraints on their results.
So our problem is - you guessed it! - that we're not specifying an
expiration date for our Atom data. As a result, Firefox uses several
other headers to take a guess at when the data is no longer fresh.
Given the nature of our application I'd like to propose that we want
data to expire immediately, forcing the client to revalidate with the
server any time it wants to get data. This doesn't mean we're
throwing away caching completely, it just means the server must
return a 304 to use cached data.
Since this is a little confusing I'll give a couple examples based on
some testing from this morning:
1) I have a collection with uid abcd containing two events "foo" and
"bar". I first fetch the collection:
GET /atom/collection/abcd/full/eim-json
Now I delete event "foo":
DELETE /atom/item/foo-uid
Now I look at the data in another view and then switch back to the
original view:
GET /atom/collection/abcd/full/eim-json
Since we didn't specify an expiration date for the collection data
the browser uses its heuristic to decide that the data in its cache
is fresh and doesn't even bother going back to the server for it.
Since foo was in the original request, foo will be in this request as
well.
2) I have a collection with uid efgh containing one event "bar". I
first fetch the collection:
GET /atom/collection/efgh/full/eim-json
Now I add a new event "foo":
POST /atom/collection/efgh/full/eim-json
<data for "foo">
Finally I refetch the data for efgh:
GET /atom/collection/efgh/full/eim-json
This time according the HTTP spec the collection data should be
invalidated. However, because of the issue mentioned in bug 9715
comment 7 it is not. Fortunately, some testing has indicated that the
caching settings I'm proposing also make this a non-issue, as Firefox
appears to respect the appropriate part of the spec in this regard.
Given the priority of this bug I'm going to start working on a
solution in this vein but I'll be sure to call out my commit to the
appropriate parties for review.
Comments and questions welcome!
-Travis
More information about the cosmo-dev
mailing list