------------------------------------------------------------ revno: 13243 revision-id: squid3@treenet.co.nz-20161217050948-dzd44ok5ad21ylpr parent: squid3@treenet.co.nz-20161216125323-xz36cyeya39lxcux fixes bug: http://bugs.squid-cache.org/show_bug.cgi?id=4169 author: Garri Djavadyan committer: Amos Jeffries branch nick: 3.4 timestamp: Sat 2016-12-17 18:09:48 +1300 message: Bug 4169: HIT marked as MISS when If-None-Match does not match ------------------------------------------------------------ # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: squid3@treenet.co.nz-20161217050948-dzd44ok5ad21ylpr # target_branch: http://bzr.squid-cache.org/bzr/squid3/3.4 # testament_sha1: 24789f0d715d80ae93185f83db61e5dc2fe189b4 # timestamp: 2016-12-17 05:12:25 +0000 # source_branch: http://bzr.squid-cache.org/bzr/squid3/3.4 # base_revision_id: squid3@treenet.co.nz-20161216125323-\ # xz36cyeya39lxcux # # Begin patch === modified file 'src/LogTags.h' --- src/LogTags.h 2013-02-11 23:11:12 +0000 +++ src/LogTags.h 2016-12-17 05:09:48 +0000 @@ -19,6 +19,7 @@ LOG_TCP_REFRESH_MODIFIED, // refresh from origin replaced existing entry LOG_TCP_CLIENT_REFRESH_MISS, LOG_TCP_IMS_HIT, + LOG_TCP_INM_HIT, LOG_TCP_SWAPFAIL_MISS, LOG_TCP_NEGATIVE_HIT, LOG_TCP_MEM_HIT, @@ -44,6 +45,7 @@ return (code == LOG_TCP_HIT) || (code == LOG_TCP_IMS_HIT) || + (code == LOG_TCP_INM_HIT) || (code == LOG_TCP_REFRESH_FAIL_OLD) || (code == LOG_TCP_REFRESH_UNMODIFIED) || (code == LOG_TCP_NEGATIVE_HIT) || === modified file 'src/client_side.cc' --- src/client_side.cc 2016-05-09 13:11:21 +0000 +++ src/client_side.cc 2016-12-17 05:09:48 +0000 @@ -456,6 +456,7 @@ statCounter.client_http.nearHitSvcTime.count(svc_time); break; + case LOG_TCP_INM_HIT: case LOG_TCP_IMS_HIT: statCounter.client_http.nearMissSvcTime.count(svc_time); break; === modified file 'src/client_side_reply.cc' --- src/client_side_reply.cc 2016-12-16 12:53:23 +0000 +++ src/client_side_reply.cc 2016-12-17 05:09:48 +0000 @@ -733,40 +733,27 @@ return true; } - bool matchedIfNoneMatch = false; if (r.header.has(HDR_IF_NONE_MATCH)) { - if (!e->hasIfNoneMatchEtag(r)) { - // RFC 2616: ignore IMS if If-None-Match did not match - r.flags.ims = false; - r.ims = -1; - r.imslen = 0; - r.header.delById(HDR_IF_MODIFIED_SINCE); - http->logType = LOG_TCP_MISS; - sendMoreData(result); - return true; - } + // RFC 7232: If-None-Match recipient MUST ignore IMS + r.flags.ims = false; + r.ims = -1; + r.imslen = 0; + r.header.delById(HDR_IF_MODIFIED_SINCE); - if (!r.flags.ims) { - // RFC 2616: if If-None-Match matched and there is no IMS, - // reply with 304 Not Modified or 412 Precondition Failed + if (e->hasIfNoneMatchEtag(r)) { sendNotModifiedOrPreconditionFailedError(); return true; } - // otherwise check IMS below to decide if we reply with 304 or 412 - matchedIfNoneMatch = true; + // None-Match is true (no ETag matched); treat as an unconditional hit + return false; } if (r.flags.ims) { // handle If-Modified-Since requests from the client if (e->modifiedSince(&r)) { - http->logType = LOG_TCP_IMS_HIT; - sendMoreData(result); - - } else if (matchedIfNoneMatch) { - // If-None-Match matched, reply with 304 Not Modified or - // 412 Precondition Failed - sendNotModifiedOrPreconditionFailedError(); + // Modified-Since is true; treat as an unconditional hit + return false; } else { // otherwise reply with 304 Not Modified @@ -1892,7 +1879,12 @@ StoreEntry *e = http->storeEntry(); const time_t timestamp = e->timestamp; HttpReply *const temprep = e->getReply()->make304(); - http->logType = LOG_TCP_IMS_HIT; + // log as TCP_INM_HIT if code 304 generated for + // If-None-Match request + if (!http->request->flags.ims) + http->logType = LOG_TCP_INM_HIT; + else + http->logType = LOG_TCP_IMS_HIT; removeClientStoreReference(&sc, http); createStoreEntry(http->request->method, RequestFlags()); e = http->storeEntry();