akosut 96/08/15 16:41:44
Modified: src http_protocol.c
Log:
If a request comes within a second of a file's last-modified date,
send a weak ETag instead of a strong one. This allows a file to be
modified twice in one second and still allow strong validation without
fear of inaccuracies.
Revision Changes Path
1.37 +9 -3 apache/src/http_protocol.c
Index: http_protocol.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_protocol.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -C3 -r1.36 -r1.37
*** http_protocol.c 1996/08/15 19:22:34 1.36
--- http_protocol.c 1996/08/15 23:41:43 1.37
***************
*** 343,356 ****
* length and inode number - note that this doesn't have to match
* the content-length (i.e. includes), it just has to be unique
* for the file.
*/
if (r->finfo.st_mode != 0)
! sprintf(etag, "\"%lx-%lx-%lx\"", r->finfo.st_ino, r->finfo.st_size,
mtime);
else
! sprintf(etag, "\"%lx\"", mtime);
! table_set (r->headers_out, "ETag", etag);
/* We now do the no_cache stuff using an Expires: header (we used to
* withhold Last-modified). However, we still want to enforce this by
--- 343,362 ----
* length and inode number - note that this doesn't have to match
* the content-length (i.e. includes), it just has to be unique
* for the file.
+ *
+ * If the request was made within a second of the last-modified date,
+ * we send a weak tag instead of a strong one, since it could
+ * be modified again later in the second, and the validation
+ * would be incorrect.
*/
if (r->finfo.st_mode != 0)
! sprintf(etag, "W/\"%lx-%lx-%lx\"", r->finfo.st_ino,
r->finfo.st_size,
mtime);
else
! sprintf(etag, "W/\"%lx\"", mtime);
! table_set (r->headers_out, "ETag",
! etag + ((r->request_time - mtime > 1) ? 2 : 0));
/* We now do the no_cache stuff using an Expires: header (we used to
* withhold Last-modified). However, we still want to enforce this by