>Number:         4415
>Category:       mod_proxy
>Synopsis:       Cache entries are unnecessarily deleted as a result of pragma: 
>no-proxy
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    apache
>State:          open
>Class:          sw-bug
>Submitter-Id:   apache
>Arrival-Date:   Fri May 14 16:20:00 PDT 1999
>Last-Modified:
>Originator:     [EMAIL PROTECTED]
>Organization:
apache
>Release:        1.3.6
>Environment:
uname -a
SunOS latimes9.su-colo.bbnplanet.com 5.6 Generic_105181-08 sun4u sparc 
SUNW,Ultra-Enterprise

Apache configured as a caching reverse proxy
>Description:
We noticed that files which do not change were constantly being removed and
recreated in the cache. We enabled the 'explain' diagnostic messages and found
that this happened when a 304 response was returned for a pragma: no-cache
request. Here's a sample log:

--- a no-cache, if-modified-since request which gives a 304:

[Fri May 14 16:03:26 1999] [debug] proxy_cache.c(662): Request for 
http://205.180.59.54/GIFS/PIXELS/blankpix.gif, pragma=no-cache, auth=(null), 
ims=926703571, imstr=Fri, 14 May 1999 17:39:31 GMT
[Fri May 14 16:03:26 1999] [debug] proxy_cache.c(760): Local copy not present 
or expired. Declining.
[Fri May 14 16:03:26 1999] [debug] proxy_cache.c(838): Response is not 
cacheable, unlinking /usr/local/apache/cache/f/9/E/pHLyjQEuHg0bTAzmyjA

--- a no-cache, if-modified-since request which gives a 200:

[Fri May 14 16:03:31 1999] [debug] proxy_cache.c(662): Request for 
http://205.180.59.54/GIFS/PIXELS/blankpix.gif, pragma=no-cache, auth=(null), 
ims=923878800, imstr=Mon, 12 Apr 1999 01:00:00 GMT
[Fri May 14 16:03:31 1999] [debug] proxy_cache.c(760): Local copy not present 
or expired. Declining.
[Fri May 14 16:03:31 1999] [debug] proxy_cache.c(899): Expiry date is 0
[Fri May 14 16:03:31 1999] [debug] proxy_cache.c(910): Expiry date calculated 
926724957
[Fri May 14 16:03:31 1999] [debug] proxy_cache.c(1006): Create temporary file 
/usr/local/apache/cache/tmp0rV_Ot

In ap_proxy_cache_check, the cache file is not opened if the request cannot
access the cache; one of the conditions in which this happens is if there is a 
pragma: no-cache. In ap_proxy_cache_update, if it is determined that the
response should not be cached, the current cache file is unlinked. One of the
rules is a 304 response when there is no cache file; the check for a cache 
file examines a filepointer which is set to NULL if the cache file was
not examined:

 * what responses should we not cache?
 * Unknown status responses and those known to be uncacheable
 * 304 HTTP_NOT_MODIFIED response when we have no valid cache file, or
 * 200 HTTP_OK response from HTTP/1.0 and up without a Last-Modified header, or
 * HEAD requests, or
 * requests with an Authorization header, or
 * protocol requests nocache (e.g. ftp with user/password)
 */
/* @@@ XXX FIXME: is the test "r->status != HTTP_MOVED_PERMANENTLY" correct?
 * or shouldn't it be "ap_is_HTTP_REDIRECT(r->status)" ? -MnKr */
    if ((r->status != HTTP_OK && r->status != HTTP_MOVED_PERMANENTLY && 
r->status != HTTP_NOT_MODIFIED) ||
        (expire != NULL && expc == BAD_DATE) ||
        (r->status == HTTP_NOT_MODIFIED && (c == NULL || c->fp == NULL)) ||
        (r->status == HTTP_OK && lmods == NULL && is_HTTP1) ||
        r->header_only ||
        ap_table_get(r->headers_in, "Authorization") != NULL ||
        nocache) {

I'm not sure about all the conditions tested for, but in the case of a 304
response to a no-pragma request, it doesn't seem appropriate to delete a
previously cached response. The proposed change bypasses the unlinking if
this is a pragma: no-cache request and the response was HTTP_NOT_MODIFIED;
perhaps the unlink just be deleted.
>How-To-Repeat:

>Fix:
Make the changes below proxy_cache.c

Note: the 'new' line numbers include the changes proposed in PR#4316; the change
at line 1095 corrects the file name displayed when an unlink of a cached
file fails

681a720,725
> /* 5/11/99 add explain to better indicate reason for not using cache */
>    else {
>       Explain0("Request is not cacheable. Declining.");
>       return DECLINED;
>       }
> /* end 5/11/99 fix */
838d881
<       Explain1("Response is not cacheable, unlinking %s", c->filename);
845c888,892
<         if (c->filename)
---
> /* 5/14/99 don't delete if this was a 304 and we had a pragma: no-cache */
>       if (c->filename && 
>           ((r->status != HTTP_NOT_MODIFIED) ||
>            (! ap_proxy_liststr(ap_table_get(r->headers_in, "Pragma"), 
> "no-cache")))) {
>            Explain1("Response is not cacheable, unlinking %s", c->filename);
846a894
>       }
1095c1143
<                    c->tempfile);
---
>                    c->filename);
>Audit-Trail:
>Unformatted:
[In order for any reply to be added to the PR database, ]
[you need to include <[EMAIL PROTECTED]> in the Cc line ]
[and leave the subject line UNCHANGED.  This is not done]
[automatically because of the potential for mail loops. ]
[If you do not include this Cc, your reply may be ig-   ]
[nored unless you are responding to an explicit request ]
[from a developer.                                      ]
[Reply only with text; DO NOT SEND ATTACHMENTS!         ]



Reply via email to