]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug 3379: Combination of If-Match and a Cache Hit result in TCP Connection Failure
authorGarri Djavadyan <garryd@comnet.uz>
Sat, 17 Dec 2016 13:23:05 +0000 (02:23 +1300)
committerAmos Jeffries <squid3@treenet.co.nz>
Sat, 17 Dec 2016 13:23:05 +0000 (02:23 +1300)
src/client_side_reply.cc
src/client_side_reply.h

index c7e3f818038339870146909f5cbb5b39909f0373..9686a9b66c1a355d8ff32b67cec00f9d7de5287e 100644 (file)
@@ -517,6 +517,7 @@ clientReplyContext::cacheHit(StoreIOBuffer result)
        ) {
         http->logType = LOG_TCP_NEGATIVE_HIT;
         sendMoreData(result);
+        return;
     } else if (!http->flags.internal && refreshCheckHTTP(e, r)) {
         debugs(88, 5, "clientCacheHit: in refreshCheck() block");
         /*
@@ -559,25 +560,29 @@ clientReplyContext::cacheHit(StoreIOBuffer result)
             http->logType = LOG_TCP_MISS;
             processMiss();
         }
-    } else if (r->conditional())
-        processConditional(result);
-    else {
-        /*
-         * plain ol' cache hit
-         */
+        return;
+    } else if (r->conditional()) {
+        debugs(88, 5, "conditional HIT");
+        if (processConditional(result))
+            return;
+    }
+
+    /*
+     * plain ol' cache hit
+     */
+    debugs(88, 5, "plain old HIT");
 
 #if DELAY_POOLS
-        if (e->store_status != STORE_OK)
-            http->logType = LOG_TCP_MISS;
-        else
+    if (e->store_status != STORE_OK)
+        http->logType = LOG_TCP_MISS;
+    else
 #endif
-            if (e->mem_status == IN_MEMORY)
-                http->logType = LOG_TCP_MEM_HIT;
-            else if (Config.onoff.offline)
-                http->logType = LOG_TCP_OFFLINE_HIT;
+        if (e->mem_status == IN_MEMORY)
+            http->logType = LOG_TCP_MEM_HIT;
+        else if (Config.onoff.offline)
+            http->logType = LOG_TCP_OFFLINE_HIT;
 
-        sendMoreData(result);
-    }
+    sendMoreData(result);
 }
 
 /**
@@ -680,7 +685,7 @@ clientReplyContext::processOnlyIfCachedMiss()
 }
 
 /// process conditional request from client
-void
+bool
 clientReplyContext::processConditional(StoreIOBuffer &result)
 {
     StoreEntry *const e = http->storeEntry();
@@ -690,7 +695,7 @@ clientReplyContext::processConditional(StoreIOBuffer &result)
                e->getReply()->sline.status << " != 200");
         http->logType = LOG_TCP_MISS;
         processMiss();
-        return;
+        return true;
     }
 
     HttpRequest &r = *http->request;
@@ -698,7 +703,7 @@ clientReplyContext::processConditional(StoreIOBuffer &result)
     if (r.header.has(HDR_IF_MATCH) && !e->hasIfMatchEtag(r)) {
         // RFC 2616: reply with 412 Precondition Failed if If-Match did not match
         sendPreconditionFailedError();
-        return;
+        return true;
     }
 
     bool matchedIfNoneMatch = false;
@@ -711,14 +716,14 @@ clientReplyContext::processConditional(StoreIOBuffer &result)
             r.header.delById(HDR_IF_MODIFIED_SINCE);
             http->logType = LOG_TCP_MISS;
             sendMoreData(result);
-            return;
+            return true;
         }
 
         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
             sendNotModifiedOrPreconditionFailedError();
-            return;
+            return true;
         }
 
         // otherwise check IMS below to decide if we reply with 304 or 412
@@ -730,19 +735,20 @@ clientReplyContext::processConditional(StoreIOBuffer &result)
         if (e->modifiedSince(&r)) {
             http->logType = LOG_TCP_IMS_HIT;
             sendMoreData(result);
-            return;
-        }
 
-        if (matchedIfNoneMatch) {
+        } else if (matchedIfNoneMatch) {
             // If-None-Match matched, reply with 304 Not Modified or
             // 412 Precondition Failed
             sendNotModifiedOrPreconditionFailedError();
-            return;
-        }
 
-        // otherwise reply with 304 Not Modified
-        sendNotModified();
+        } else {
+            // otherwise reply with 304 Not Modified
+            sendNotModified();
+        }
+        return true;
     }
+
+    return false;
 }
 
 void
index c979fe4e8446a80b2739b0642b54d39750d28c29..4ab6de2dbeae18c6b9b63486b86527a76fe349cc 100644 (file)
@@ -128,7 +128,7 @@ private:
     bool alwaysAllowResponse(http_status sline) const;
     int checkTransferDone();
     void processOnlyIfCachedMiss();
-    void processConditional(StoreIOBuffer &result);
+    bool processConditional(StoreIOBuffer &result);
     void cacheHit(StoreIOBuffer result);
     void handleIMSReply(StoreIOBuffer result);
     void sendMoreData(StoreIOBuffer result);