From 645055d1505d8ece5efc545ea6b5e5730b99019a Mon Sep 17 00:00:00 2001 From: Alex Rousskov Date: Sat, 14 Dec 2013 22:23:23 -0700 Subject: [PATCH] Bug 3806: Caching responses with Vary header Ported from 3.5 by Martin Sperl --- src/MemStore.cc | 6 ++++++ src/client_side_reply.cc | 2 ++ src/store.cc | 6 ++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/MemStore.cc b/src/MemStore.cc index be88e20ed1..b86f3e00b5 100644 --- a/src/MemStore.cc +++ b/src/MemStore.cc @@ -310,6 +310,12 @@ MemStore::considerKeeping(StoreEntry &e) return; } + if (e.mem_obj->vary_headers) { + // XXX: We must store/load SerialisedMetaData to cache Vary in RAM + debugs(20, 5, "Vary not yet supported: " << e.mem_obj->vary_headers); + return; + } + keep(e); // may still fail } diff --git a/src/client_side_reply.cc b/src/client_side_reply.cc index 51628cc8d5..1d321c8da9 100644 --- a/src/client_side_reply.cc +++ b/src/client_side_reply.cc @@ -507,6 +507,7 @@ clientReplyContext::cacheHit(StoreIOBuffer result) if (strcmp(e->mem_obj->url, urlCanonical(r)) != 0) { debugs(33, DBG_IMPORTANT, "clientProcessHit: URL mismatch, '" << e->mem_obj->url << "' != '" << urlCanonical(r) << "'"); + http->logType = LOG_TCP_MISS; // we lack a more precise LOG_*_MISS code processMiss(); return; } @@ -538,6 +539,7 @@ clientReplyContext::cacheHit(StoreIOBuffer result) case VARY_CANCEL: /* varyEvaluateMatch found a object loop. Process as miss */ debugs(88, DBG_IMPORTANT, "clientProcessHit: Vary object loop!"); + http->logType = LOG_TCP_MISS; // we lack a more precise LOG_*_MISS code processMiss(); return; } diff --git a/src/store.cc b/src/store.cc index 5161fa53b9..9aac12d343 100644 --- a/src/store.cc +++ b/src/store.cc @@ -761,7 +761,7 @@ StoreEntry::setPublicKey() StoreEntry *pe = storeCreateEntry(mem_obj->url, mem_obj->log_url, request->flags, request->method); /* We are allowed to do this typecast */ HttpReply *rep = new HttpReply; - rep->setHeaders(HTTP_OK, "Internal marker object", "x-squid-internal/vary", -1, -1, squid_curtime + 100000); + rep->setHeaders(HTTP_OK, "Internal marker object", "x-squid-internal/vary", 0, -1, squid_curtime + 100000); vary = mem_obj->getReply()->header.getList(HDR_VARY); if (vary.size()) { @@ -780,12 +780,14 @@ StoreEntry::setPublicKey() } #endif - pe->replaceHttpReply(rep); + pe->replaceHttpReply(rep, false); // no write until key is public pe->timestampsSet(); pe->makePublic(); + pe->startWriting(); // after makePublic() + pe->complete(); pe->unlock(); -- 2.47.2