Hi,

I'm going over mod_cache and I'm wondering about some things:

--
modules/cache/mod_cache.c:271

   /* If the request has Cache-Control: no-store from RFC 2616, don't store
    * unless CacheStoreNoStore is active.
    */
   cc_in = apr_table_get(r->headers_in, "Cache-Control");
   if (r->no_cache ||
       (!conf->store_nostore &&
        ap_cache_liststr(NULL, cc_in, "no-store", NULL))) {
       ap_remove_output_filter(f);
       return ap_pass_brigade(f->next, in);
   }

What happens if the 'Cache-Control: no-store' header came in with a
304 Not Modified and the original request wasn't conditional?
If I read the spec correctly a 304 can carry a Cache-Control header,
if it has a different value since a previous 200 (or 304).

--
modules/cache/mod_cache.c:308

/* have we already run the cachability check and set up the
* cached file handle? */
if (cache->in_checked) {
/* pass the brigades into the cache, then pass them
* up the filter stack
*/


I haven't tracked cache->in_checked fully, so I wonder if it is
possible that this is set on a validating request?  That would
cause the cache not being updated, which is what I am trying to
track down FWIW.  This is not 'my' bug though, since I am seeing
the following line in the log:

 [debug] mod_disk_cache.c(616): disk_cache: Stored headers for URL xxx

However the cache files on disk don't change... I'm a bit puzzled why
not from looking at the code.

--
modules/cache/mod_cache.c:371

/*
* what responses should we not cache?
*
* At this point we decide based on the response headers whether it
* is appropriate _NOT_ to cache the data from the server. There are
* a whole lot of conditions that prevent us from caching this data.
* They are tested here one by one to be clear and unambiguous. */
if (r->status != HTTP_OK && r->status != HTTP_NON_AUTHORITATIVE
&& r->status != HTTP_MULTIPLE_CHOICES
&& r->status != HTTP_MOVED_PERMANENTLY
&& r->status != HTTP_NOT_MODIFIED) {
/* RFC2616 13.4 we are allowed to cache 200, 203, 206, 300, 301 or 410
* We don't cache 206, because we don't (yet) cache partial responses.
* We include 304 Not Modified here too as this is the origin server
* telling us to serve the cached copy.
*/
reason = apr_psprintf(p, "Response status %d", r->status);
}


AIUI, we can cache "302 Found" (HTTP_MOVED_TEMPORARILY) when it has an Expires
or Cache-Control indicating that the request can be cached.

--
modules/cache/mod_cache.c:685

   /* Did we just update the cached headers on a revalidated response?
    *
    * If so, we can now decide what to serve to the client:
    * - If the original request was conditional and is satisified, send 304.
    * - Otherwise, send the cached body.
   */
   if (rv == APR_SUCCESS && cache->stale_handle) {
       apr_bucket_brigade *bb;
       apr_bucket *bkt;

       bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);

       /* Were we initially a conditional request? */
       if (ap_cache_request_is_conditional(cache->stale_headers)) {
           /* FIXME: We must ensure that the request meets conditions. */

           /* Set the status to be a 304. */
           r->status = HTTP_NOT_MODIFIED;

Is this as simple as clearing r->headers_in, overwriting with 
cache->stale_headers,
and the calling ap_meets_conditions()?



Sander

Reply via email to