From: Eduard Bagdasaryan Date: Thu, 1 Jun 2017 23:49:09 +0000 (-0600) Subject: Do not respond with HTTP/304 to unconditional requests X-Git-Tag: M-staged-PR71~147 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e7e0f8a42af794754a48239ecbf64bf62043792c;p=thirdparty%2Fsquid.git 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 a367b5b674..767a43ac25 100644 --- a/src/client_side_reply.cc +++ b/src/client_side_reply.cc @@ -89,6 +89,7 @@ clientReplyContext::clientReplyContext(ClientHttpRequest *clientContext) : reply(NULL), old_entry(NULL), old_sc(NULL), + old_lastmod(-1), deleting(false), collapsedRevalidation(crNone) { @@ -204,6 +205,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 */ @@ -223,9 +226,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 fee2425a97..62fb08e93d 100644 --- a/src/client_side_reply.h +++ b/src/client_side_reply.h @@ -131,7 +131,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 {