]> granicus.if.org Git - apache/commitdiff
Fix if-modified-since on win32, I think. It should fix it in theory.
authorCliff Woolley <jwoolley@apache.org>
Wed, 8 May 2002 02:17:04 +0000 (02:17 +0000)
committerCliff Woolley <jwoolley@apache.org>
Wed, 8 May 2002 02:17:04 +0000 (02:17 +0000)
Verification would be nice.  At least I know it still works on Unix.  ;)

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@95007 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/http/http_protocol.c

diff --git a/CHANGES b/CHANGES
index ff0f09a72fa79015507d0f1525fe0a58d18734f3..e48607bf01ed8292e31cc94be00022a84dfab3a4 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,9 @@
 Changes with Apache 2.0.37
 
+  *) Fixed If-Modified-Since on Win32, which would give false positives
+     because of the sub-second resolution of file timestamps on that
+     platform.  [Cliff Woolley]
+
   *) Reverse the hook ordering for mod_userdir and mod_alias so
      that Alias/ScriptAlias will override Userdir.  PR 8841
      [Joshua Slive]
index 6a79f83f3330853fb203fb452fc4be5c0b55e1e8..d54a93d7fc8c85f92b4d172f008cc1ea941135b6 100644 (file)
@@ -290,7 +290,7 @@ AP_DECLARE(int) ap_meets_conditions(request_rec *r)
 {
     const char *etag;
     const char *if_match, *if_modified_since, *if_unmodified, *if_nonematch;
-    apr_time_t mtime;
+    apr_int64_t mtime;
 
     /* Check for conditional requests --- note that we only want to do
      * this if we are successful so far and we are not processing a
@@ -309,8 +309,11 @@ AP_DECLARE(int) ap_meets_conditions(request_rec *r)
 
     etag = apr_table_get(r->headers_out, "ETag");
 
+    /* All of our comparisons must be in seconds, because that's the
+     * highest time resolution the HTTP specification allows.
+     */
     /* XXX: we should define a "time unset" constant */
-    mtime = (r->mtime != 0) ? r->mtime : apr_time_now();
+    mtime = ((r->mtime != 0) ? r->mtime : apr_time_now()) / APR_USEC_PER_SEC;
 
     /* If an If-Match request-header field was given
      * AND the field value is not "*" (meaning match anything)
@@ -334,7 +337,7 @@ AP_DECLARE(int) ap_meets_conditions(request_rec *r)
         if (if_unmodified != NULL) {
             apr_time_t ius = apr_date_parse_http(if_unmodified);
 
-            if ((ius != APR_DATE_BAD) && (mtime > ius)) {
+            if ((ius != APR_DATE_BAD) && (mtime > (ius / APR_USEC_PER_SEC))) {
                 return HTTP_PRECONDITION_FAILED;
             }
         }
@@ -387,9 +390,12 @@ AP_DECLARE(int) ap_meets_conditions(request_rec *r)
              && ((if_modified_since =
                   apr_table_get(r->headers_in,
                                 "If-Modified-Since")) != NULL)) {
-        apr_time_t ims = apr_date_parse_http(if_modified_since);
+        apr_int64_t ims, reqtime;
+
+        ims = apr_date_parse_http(if_modified_since) / APR_USEC_PER_SEC;
+        reqtime = r->request_time / APR_USEC_PER_SEC;
 
-        if ((ims >= mtime) && (ims <= r->request_time)) {
+        if ((ims >= mtime) && (ims <= reqtime)) {
             return HTTP_NOT_MODIFIED;
         }
     }