Hi,

Attached is a patch that will solve the 304 turning into 200 response code
problem.  It seems that in mod_disk_cache the status line was also saved
and restored from the cache.  On a first request it is saved as "200 OK" or
something to the cache file.  On subsequent requests it is restored into
r->status_line.

The problem occurs when afterwards mod_cache decides that the response
should be a "304 not modified".  The status line is not reset in this case
and send as a "200 OK" response without a body.

The solution: not restoring the status line from the cache.  The http
response header filter will then construct a status line starting from
the status code, which is 304.  Problem solved.

Kris Verbeeck wrote:
> 
> Hi,
> 
> When refreshing a page (with IE) the browser sends a 'If-Modified-Since'
> header in the request.  As seen in the debug log below, mod_cache has
> verified that the page has not been modified and wants to return an HTTP
> status 304.  Somehow this 304 doesn't get to the browser.  Instead of
> sending the 304 response apache sends a 200 response without a body
> (see ethereal output of request and response below).  This results in the
> browser displaying an empty (white) page.
> 
> If a request is send without the 'If-Modified-Since' header then everything
> works OK, i.e. a 200 response is send with the cached body.
> 
> I have already been tracing through httpd with gdb, but found nothing.
> Does anyone have any idea about what is going on with the 304 response?
> 
> Setup: apache httpd 2.0.40 (with cache patches from CVS)
> 
> The request:
> 
>         GET /index.html HTTP/1.1
>         Accept: */*
>         Accept-Language: en-us
>         Accept-Encoding: gzip, deflate
>         If-Modified-Since: Thu, 02 May 2002 12:01:37 GMT; length=8809
>         User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
>         Host: pino.be.ubizen.com
>         Connection: Keep-Alive
> 
> The response:
> 
>         HTTP/1.0 200
>         Date: Tue, 10 Sep 2002 09:45:39 GMT
>         Server: web server
>         Connection: close
>         etag: "b9829-2269-3cd12aa1"
> 
> The debug log:
> 
>         [date] [debug] mod_cache.c(112): cache: URL /index.html is being handled by 
>disk
>         [date] [info] disk_cache: Serving Cached URL /index.html
>         [date] [info] disk_cache: Served headers for URL /index.html
>         [date] [debug] mod_cache.c(216): cache: fresh cache - returning status 304
> 
> --
> ir. Kris Verbeeck
> Development Engineer
> 
> Ubizen - Ubicenter - Philipssite 5 - 3001 Leuven - Belgium
> T:  +32 16 28 70 64
> F:  +32 16 28 70 77
> 
> Ubizen - We Secure e-business - www.ubizen.com

-- 
ir. Kris Verbeeck
Development Engineer

Ubizen - Ubicenter - Philipssite 5 - 3001 Leuven - Belgium
T:  +32 16 28 70 64
F:  +32 16 28 70 77

Ubizen - We Secure e-business - www.ubizen.com
--- mod_disk_cache.c    Wed Sep 11 16:33:25 2002
+++ mod_disk_cache.c-PATCHED    Wed Sep 11 16:32:54 2002
@@ -484,6 +484,17 @@
 
     r->status = atoi(urlbuff);                           /* Save status line into 
request rec  */
 
+    rv = apr_file_gets(&urlbuff[0], urllen, dobj->hfd);               /* Read status 
+line */
+    if (rv != APR_SUCCESS) {
+        /* XXX log message */
+       return rv;
+    }
+
+    if ((temp = strchr(&urlbuff[0], '\n')) != NULL)       /* trim off new line 
+character */
+       *temp = '\0';              /* overlay it with the null terminator */
+
+    r->status_line = apr_pstrdup(r->pool, urlbuff);            /* Save status line 
+into request rec  */
+
     h->req_hdrs = apr_table_make(r->pool, 20);
     
     /*

Reply via email to