From: Eduard Bagdasaryan Date: Wed, 14 Jun 2017 21:59:06 +0000 (+1200) Subject: Bug 2833 pt3: Do not respond with HTTP/304 to unconditional requests X-Git-Tag: SQUID_3_5_28~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7c7e5e416e91eb00ee62a04e28fa73dd93044441;p=thirdparty%2Fsquid.git Bug 2833 pt3: Do not respond with HTTP/304 to unconditional requests ... after internal revalidation. The original unconditional HttpRequest was still marked (and processed) as conditional after internal revalidation because the original (clear) Last-Modified and ETag values were not restored (cleared) after the internal revalidation abused them. TODO: Isolate the code converting the request into conditional one _and_ the code that undoes that conversion, to keep both actions in sync. --- diff --git a/src/client_side_reply.cc b/src/client_side_reply.cc index ac712b5de0..06ae1c45e6 100644 --- a/src/client_side_reply.cc +++ b/src/client_side_reply.cc @@ -72,8 +72,8 @@ clientReplyContext::~clientReplyContext() HTTPMSGUNLOCK(reply); } -clientReplyContext::clientReplyContext(ClientHttpRequest *clientContext) : http (cbdataReference(clientContext)), old_entry (NULL), old_sc(NULL), deleting(false), - collapsedRevalidation(crNone) +clientReplyContext::clientReplyContext(ClientHttpRequest *clientContext) : http (cbdataReference(clientContext)), old_entry (NULL), + old_sc(NULL), old_lastmod(-1), deleting(false), collapsedRevalidation(crNone) {} /** Create an error in the store awaiting the client side to read it. @@ -185,6 +185,8 @@ clientReplyContext::saveState() debugs(88, 3, "clientReplyContext::saveState: saving store context"); old_entry = http->storeEntry(); old_sc = sc; + old_lastmod = http->request->lastmod; + old_etag = http->request->etag; old_reqsize = reqsize; tempBuffer.offset = reqofs; /* Prevent accessing the now saved entries */ @@ -204,9 +206,13 @@ clientReplyContext::restoreState() sc = old_sc; reqsize = old_reqsize; reqofs = tempBuffer.offset; + http->request->lastmod = old_lastmod; + http->request->etag = old_etag; /* Prevent accessed the old saved entries */ old_entry = NULL; old_sc = NULL; + old_lastmod = -1; + old_etag.clean(); old_reqsize = 0; tempBuffer.offset = 0; } diff --git a/src/client_side_reply.h b/src/client_side_reply.h index b380360f88..7e770388ea 100644 --- a/src/client_side_reply.h +++ b/src/client_side_reply.h @@ -130,7 +130,11 @@ private: void sendNotModifiedOrPreconditionFailedError(); StoreEntry *old_entry; - store_client *old_sc; /* ... for entry to be validated */ + /* ... for entry to be validated */ + store_client *old_sc; + time_t old_lastmod; + String old_etag; + bool deleting; typedef enum {