On 3 May 2002 [EMAIL PROTECTED] wrote:

> There seems to be an error in the handling of If-Modified-Since.
> Steps to reproduce:
> 1. Send the following request to www.dawnorchid.com:
>
> GET / HTTP/1.1
> Host: www.dawnorchid.com
>
> Resulting header is
>
> HTTP/1.1 200 OK
> Date: Sat, 04 May 2002 02:07:27 GMT
> Server: Apache/2.0.35 (Win32) PHP/4.2.0
> Last-Modified: Mon, 29 Apr 2002 07:58:14 GMT
>
> 2. Send another request for the same page, using the above timestamp in an If-
> Modified-Since field.
>
> GET / HTTP/1.1
> Host: www.dawnorchid.com
> If-Modified-Since: Mon, 29 Apr 2002 07:58:14 GMT
>
> Expected result: a 304 Not Modified response.
> Actual result: a 200 OK response with the full HTML page.
>
> If I change the time in the If-Modified-Since field to one second later
> (07:58:15 instead of 07:58:14), the expected 304 Not Modified response is
> returned.


Hmm..  the related code seems to be this snippet from http_protocol.c:

    else if ((r->method_number == M_GET)
             && ((if_modified_since =
                  apr_table_get(r->headers_in,
                                "If-Modified-Since")) != NULL)) {
        apr_time_t ims = apr_date_parse_http(if_modified_since);

        if ((ims >= mtime) && (ims <= r->request_time)) {
            return HTTP_NOT_MODIFIED;
        }
    }
    return OK;


Which *looks* okay.  My best guess is that, since we're comparing
apr_time_t's, maybe mtime includes some number of microseconds and thus is
greater than the ims for the same second.  Does that sound reasonable?  If
so, I guess we need to divide ims, mtime, and r->request_time by
APR_USEC_PER_SEC before comparison.

--Cliff


--------------------------------------------------------------
   Cliff Woolley
   [EMAIL PROTECTED]
   Charlottesville, VA


Reply via email to