]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Replaced X-Cache and X-Cache-Lookup headers with Cache-Status (#705)
authorAmos Jeffries <yadij@users.noreply.github.com>
Fri, 28 Aug 2020 18:47:04 +0000 (18:47 +0000)
committerSquid Anubis <squid-anubis@squid-cache.org>
Fri, 28 Aug 2020 20:37:07 +0000 (20:37 +0000)
See https://tools.ietf.org/html/draft-ietf-httpbis-cache-header

Also switched to identifying Squid instance in the header using
unique_hostname(), fixing a bug affecting proxies that share the same
visible_hostname in a cluster. The Cache-Status field values will now
point to a specific proxy in such a cluster.

The new initial lookup reporting (formally X-Cache-Lookup)
implementation has several differences:

* The reporting of the lookup is now unconditional, just like the
  Cache-Status reporting itself. The dropped X-Cache-Lookup required
  --enable-cache-digests. We removed that precondition because
  Cache-Status already relays quite a bit of information, and sharing
  lookup details is unlikely to tilt the balance in most environments.
  The original lookup reporting code was conditional because the feature
  was added for Cache Digests debugging, not because we wanted to hide
  the info. Folks later discovered that the info is useful in many other
  cases. If we do want to hide this information, it should be done
  directly rather than via a (no) Cache Digests side effect.

* The initial lookup classification can no longer be overwritten by
  additional Store lookups. Official code allowed such rewrites due to
  implementation bugs. If we only report one lookup, the first lookup
  classification is the most valuable one and almost eliminates doubts
  about the the cache state at the request time. Ideally, we should also
  exclude various internal Store lookup checks that may hide a matching
  cache entry, but that exclusion is difficult to implement with the
  current needlessly asynchronous create() Store API.

* Lookup reporting now covers more use cases. The official code probably
  missed or mishandled various PURGE/DELETE use cases and did not
  distinguish absence of Store lookup because of CC:no-cache from other
  lookup bypass cases (e.g., errors). More work is probably needed to
  cover every lookup-avoiding case.

src/LogTags.cc
src/LogTags.h
src/client_side_reply.cc
src/client_side_reply.h
src/http/RegisteredHeaders.h
src/http/RegisteredHeadersHash.cci
src/http/RegisteredHeadersHash.gperf

index 4c9616b98aa18a07f0e3bfca988ebf7fe7a57f0e..49d0579241b7d3c14ebade2a91dc202f4564f155 100644 (file)
@@ -101,3 +101,77 @@ LogTags::isTcpHit() const
         (oldType == LOG_TCP_OFFLINE_HIT);
 }
 
+const char *
+LogTags::cacheStatusSource() const
+{
+    // see draft-ietf-httpbis-cache-header for the (quoted below) specs
+    switch (oldType) {
+    case LOG_TAG_NONE:
+        return nullptr;
+
+    case LOG_TCP_HIT:
+    case LOG_TCP_IMS_HIT:
+    case LOG_TCP_INM_HIT:
+    case LOG_TCP_REFRESH_FAIL_OLD:
+    case LOG_TCP_REFRESH_UNMODIFIED:
+    case LOG_TCP_NEGATIVE_HIT:
+    case LOG_TCP_MEM_HIT:
+    case LOG_TCP_OFFLINE_HIT:
+        // We put LOG_TCP_REFRESH_UNMODIFIED and LOG_TCP_REFRESH_FAIL_OLD here
+        // because the specs probably classify master transactions where the
+        // client request did "go forward" but the to-client response was
+        // ultimately "obtained from the cache" as "hit" transactions.
+        return ";hit";
+
+    case LOG_TCP_MISS:
+#if USE_DELAY_POOLS
+        // do not lie until we get a better solution for bugs 1000, 2096
+        return nullptr;
+#else
+        // TODO: "distinguish between uri-miss and vary-miss"
+        return ";fwd=miss";
+#endif
+
+    case LOG_TCP_REFRESH_MODIFIED:
+    case LOG_TCP_REFRESH:
+        return ";fwd=stale";
+
+    case LOG_TCP_CLIENT_REFRESH_MISS:
+        return ";fwd=request";
+
+    case LOG_TCP_REFRESH_FAIL_ERR:
+    case LOG_TCP_SWAPFAIL_MISS:
+        // Ignore "to be used when the implementation cannot distinguish between
+        // uri-miss and vary-miss" specs condition as being too restrictive,
+        // especially when there is no fwd=other or a more suitable parameter.
+        return ";fwd=miss";
+
+    case LOG_TCP_DENIED:
+    case LOG_TCP_DENIED_REPLY:
+    case LOG_TCP_REDIRECT:
+        // We served a Squid-generated response (with or without forwarding).
+        // The response itself should provide enough classification clues.
+        return nullptr;
+
+    case LOG_TCP_TUNNEL:
+        // could use fwd=bypass, but the CONNECT request was not really bypassed
+        return nullptr;
+
+    case LOG_UDP_HIT:
+    case LOG_UDP_MISS:
+    case LOG_UDP_DENIED:
+    case LOG_UDP_INVALID:
+    case LOG_UDP_MISS_NOFETCH:
+    case LOG_ICP_QUERY:
+        // do not bother classifying these non-HTTP outcomes for now
+        return nullptr;
+
+    case LOG_TYPE_MAX:
+        // should not happen
+        return nullptr;
+    }
+
+    // should not happen
+    return nullptr;
+}
+
index 5d9dbe4e48944399ce25d0287029ccd7589796e6..e5732765ffb9a97be946e49f72ff9658c3a3f1fc 100644 (file)
@@ -62,6 +62,9 @@ public:
     /// determine if the log tag code indicates a cache HIT
     bool isTcpHit() const;
 
+    /// \returns Cache-Status "hit" or "fwd=..." parameter (or nil)
+    const char *cacheStatusSource() const;
+
     /// Things that may happen to a transaction while it is being
     /// processed according to its LOG_* category. Logged as _SUFFIX(es).
     /// Unlike LOG_* categories, these flags may not be mutually exclusive.
index 7830e4e43d75c771bbc763dce99ca2a9be391b7d..c9191049bf32f32ed73f43939fc80ec42b53b6db 100644 (file)
@@ -81,9 +81,6 @@ clientReplyContext::clientReplyContext(ClientHttpRequest *clientContext) :
     old_reqsize(0),
     reqsize(0),
     reqofs(0),
-#if USE_CACHE_DIGESTS
-    lookup_type(NULL),
-#endif
     ourNode(NULL),
     reply(NULL),
     old_entry(NULL),
@@ -934,6 +931,8 @@ clientReplyContext::purgeAllCached()
 void
 clientReplyContext::created(StoreEntry *newEntry)
 {
+    detailStoreLookup(newEntry ? "match" : "mismatch");
+
     if (lookingforstore == 1)
         purgeFoundGet(newEntry);
     else if (lookingforstore == 2)
@@ -1562,17 +1561,15 @@ clientReplyContext::buildReplyHeader()
         Auth::UserRequest::AddReplyAuthHeader(reply, request->auth_user_request, request, http->flags.accel, 0);
 #endif
 
-    /* Append X-Cache */
-    httpHeaderPutStrf(hdr, Http::HdrType::X_CACHE, "%s from %s",
-                      is_hit ? "HIT" : "MISS", getMyHostname());
-
-#if USE_CACHE_DIGESTS
-    /* Append X-Cache-Lookup: -- temporary hack, to be removed @?@ @?@ */
-    httpHeaderPutStrf(hdr, Http::HdrType::X_CACHE_LOOKUP, "%s from %s:%d",
-                      lookup_type ? lookup_type : "NONE",
-                      getMyHostname(), getMyPort());
-
-#endif
+    SBuf cacheStatus(uniqueHostname());
+    if (const auto hitOrFwd = http->logType.cacheStatusSource())
+        cacheStatus.append(hitOrFwd);
+    if (firstStoreLookup_) {
+        cacheStatus.append(";detail=");
+        cacheStatus.append(firstStoreLookup_);
+    }
+    // TODO: Remove c_str() after converting HttpHeaderEntry::value to SBuf
+    hdr->putStr(Http::HdrType::CACHE_STATUS, cacheStatus.c_str());
 
     const bool maySendChunkedReply = !request->multipartRangeRequest() &&
                                      reply->sline.protocol == AnyP::PROTO_HTTP && // response is HTTP
@@ -1696,6 +1693,8 @@ clientReplyContext::identifyStoreObject()
         lookingforstore = 5;
         StoreEntry::getPublicByRequest (this, r);
     } else {
+        // "external" no-cache requests skip Store lookups
+        detailStoreLookup("no-cache");
         identifyFoundObject(nullptr);
     }
 }
@@ -1718,10 +1717,6 @@ clientReplyContext::identifyFoundObject(StoreEntry *newEntry)
     if (r->flags.noCache || r->flags.noCacheHack())
         ipcacheInvalidateNegative(r->url.host());
 
-#if USE_CACHE_DIGESTS
-    lookup_type = e ? "HIT" : "MISS";
-#endif
-
     if (!e) {
         /** \li If no StoreEntry object is current assume this object isn't in the cache set MISS*/
         debugs(85, 3, "StoreEntry is NULL -  MISS");
@@ -1784,6 +1779,18 @@ clientReplyContext::identifyFoundObject(StoreEntry *newEntry)
     doGetMoreData();
 }
 
+/// remembers the very first Store lookup classification, ignoring the rest
+void
+clientReplyContext::detailStoreLookup(const char *detail)
+{
+    if (!firstStoreLookup_) {
+        debugs(85, 7, detail);
+        firstStoreLookup_ = detail;
+    } else {
+        debugs(85, 7, "ignores " << detail << " after " << firstStoreLookup_);
+    }
+}
+
 /**
  * Request more data from the store for the client Stream
  * This is *the* entry point to this module.
index 8678f538bdbd063a5eb4ca00605e9e76170d1b7f..b55a18aa3695957d4f969daff7e1728b32eeb24c 100644 (file)
@@ -90,10 +90,6 @@ public:
     size_t reqsize;
     size_t reqofs;
     char tempbuf[HTTP_REQBUF_SZ];   ///< a temporary buffer if we need working storage
-#if USE_CACHE_DIGESTS
-
-    const char *lookup_type;    /* temporary hack: storeGet() result: HIT/MISS/NONE */
-#endif
 
     struct Flags {
         Flags() : storelogiccomplete(0), complete(0), headersSent(false) {}
@@ -133,12 +129,18 @@ private:
     void purgeAllCached();
     void forgetHit();
     bool blockedHit() const;
+    void detailStoreLookup(const char *detail);
 
     void sendBodyTooLargeError();
     void sendPreconditionFailedError();
     void sendNotModified();
     void sendNotModifiedOrPreconditionFailedError();
 
+    /// Classification of the initial Store lookup.
+    /// This very first lookup happens without the Vary-driven key augmentation.
+    /// TODO: Exclude internal Store match bans from the "mismatch" category.
+    const char *firstStoreLookup_ = nullptr;
+
     StoreEntry *old_entry;
     /* ... for entry to be validated */
     store_client *old_sc;
index 36dcd33a84e16d6e299f000612ad59241e323982..3b09a481fbb04e872810c37d11fdd93bfc606cf3 100644 (file)
@@ -32,6 +32,7 @@ enum HdrType {
     AUTHENTICATION_INFO,            /**< RFC 2617 */
     AUTHORIZATION,                  /**< RFC 7235, 4559 */
     CACHE_CONTROL,                  /**< RFC 7234 */
+    CACHE_STATUS,                   /**< draft-ietf-httpbis-cache-header */
     CDN_LOOP,                       /**< RFC 8586 */
     CONNECTION,                     /**< RFC 7230 */
     CONTENT_BASE,                   /**< obsoleted RFC 2068 */
@@ -104,8 +105,6 @@ enum HdrType {
     VIA,                            /**< RFC 7230 */
     WARNING,                        /**< RFC 7234 */
     WWW_AUTHENTICATE,               /**< RFC 7235, 4559 */
-    X_CACHE,                        /**< Squid custom header */
-    X_CACHE_LOOKUP,                 /**< Squid custom header. temporary hack that became de-facto. TODO remove */
     X_FORWARDED_FOR,                /**< obsolete Squid custom header, RFC 7239 */
     X_REQUEST_URI,                  /**< Squid custom header appended if ADD_X_REQUEST_URI is defined */
     X_SQUID_ERROR,                  /**< Squid custom header on generated error responses */
index b309281e444b7164e5b405886d138316748ee8ec..aee8c808b8832622e705fc886fabd9e84ac13569 100644 (file)
@@ -1,6 +1,6 @@
 /* C++ code produced by gperf version 3.1 */
 /* Command-line: gperf -m 100000 RegisteredHeadersHash.gperf  */
-/* Computed positions: -k'1,9,$' */
+/* Computed positions: -k'3,9,$' */
 
 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
 && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
 struct HeaderTableRecord;
         enum
 {
-    TOTAL_KEYWORDS = 89,
+    TOTAL_KEYWORDS = 88,
     MIN_WORD_LENGTH = 2,
     MAX_WORD_LENGTH = 25,
-    MIN_HASH_VALUE = 13,
-    MAX_HASH_VALUE = 114
+    MIN_HASH_VALUE = 5,
+    MAX_HASH_VALUE = 109
 };
 
-/* maximum key range = 102, duplicates = 0 */
+/* maximum key range = 105, duplicates = 0 */
 
 #ifndef GPERF_DOWNCASE
 #define GPERF_DOWNCASE 1
@@ -111,32 +111,32 @@ HttpHeaderHashTable::HttpHeaderHash (const char *str, size_t len)
 {
     static const unsigned char asso_values[] =
     {
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115,  27, 115, 115,   4, 115, 115, 115, 115,
-        26, 115, 115,  33, 115, 115, 115, 115,  25, 115,
-        115, 115, 115, 115, 115,  15,   7,   7,  10,   4,
-        33,  66,  42,  22, 115,  63,  10,  33,  18,  44,
-        11, 115,   4,  28,  10,  42,  23,  26,  31,  30,
-        115, 115, 115, 115, 115, 115, 115,  15,   7,   7,
-        10,   4,  33,  66,  42,  22, 115,  63,  10,  33,
-        18,  44,  11, 115,   4,  28,  10,  42,  23,  26,
-        31,  30, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-        115, 115, 115, 115, 115, 115
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110,   0, 110, 110,  13, 110, 110, 110, 110,
+        12, 110, 110,  41, 110, 110, 110, 110,  26, 110,
+        110, 110, 110, 110, 110,  16,  10,  10,  20,   4,
+        10,  47,  50,  62, 110,   0,  38,  30,   1,   2,
+        33,  30,  32,  14,   0,  21,   5,  23,  19,  36,
+        110, 110, 110, 110, 110, 110, 110,  16,  10,  10,
+        20,   4,  10,  47,  50,  62, 110,   0,  38,  30,
+        1,   2,  33,  30,  32,  14,   0,  21,   5,  23,
+        19,  36, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
+        110, 110, 110, 110, 110, 110
     };
     unsigned int hval = len;
 
@@ -151,9 +151,9 @@ HttpHeaderHashTable::HttpHeaderHash (const char *str, size_t len)
     case 5:
     case 4:
     case 3:
+        hval += asso_values[static_cast<unsigned char>(str[2])];
+    /*FALLTHROUGH*/
     case 2:
-    case 1:
-        hval += asso_values[static_cast<unsigned char>(str[0])];
         break;
     }
     return hval + asso_values[static_cast<unsigned char>(str[len - 1])];
@@ -161,208 +161,206 @@ HttpHeaderHashTable::HttpHeaderHash (const char *str, size_t len)
 
 static const unsigned char lengthtable[] =
 {
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,
-    0,  7,  2,  6,  4,  5,  6,  7,  3,  0,  6, 13,  8,  9,
-    13, 11, 12,  6,  6, 12,  8,  9,  8, 16,  6,  7,  7,  3,
-    7, 18,  7, 13,  5, 18, 13, 15, 16, 16, 13,  7, 19, 13,
-    4,  4, 19, 17, 15, 13,  9, 16, 10, 17, 14, 19,  6, 11,
-    4, 13,  8, 14,  4,  6, 13,  4, 15, 10, 10, 14, 20, 18,
-    11, 19, 15, 11, 12, 10, 25, 12,  0, 16, 14,  0,  3, 17,
-    0,  7, 10,  0,  0,  0,  0, 10,  0, 13,  0,  0, 13, 21,
-    0, 10, 15
+    0,  0,  0,  0,  0,  4,  2,  0,  4,  5,  5,  3,  6,  0,
+    10, 10,  6, 12,  4,  8, 16,  7, 19, 10, 18,  8,  6, 12,
+    14, 25, 13, 19,  0,  9, 15,  3,  4, 10,  6,  6,  0, 19,
+    8, 11,  7, 15, 10, 16, 13,  7, 13, 15, 12, 13,  7,  7,
+    16, 12,  7, 16, 18, 12, 13, 13,  9, 21,  5,  4, 16,  6,
+    6,  8,  4, 15, 14,  3, 10, 15, 10, 13, 11,  9,  6, 11,
+    0, 11,  7,  0,  0,  0, 13, 17, 20, 17,  0,  0, 17,  0,
+    19,  0,  0,  0, 18, 14,  0,  0, 13, 13,  0, 13
 };
 
 static const struct HeaderTableRecord HttpHeaderDefinitionsTable[] =
 {
-    {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-    {""}, {""}, {""}, {""},
-#line 79 "RegisteredHeadersHash.gperf"
-    {"Range", Http::HdrType::RANGE, Http::HdrFieldType::ftPRange, HdrKind::RequestHeader},
-    {""},
-#line 80 "RegisteredHeadersHash.gperf"
-    {"Referer", Http::HdrType::REFERER, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 86 "RegisteredHeadersHash.gperf"
+    {""}, {""}, {""}, {""}, {""},
+#line 67 "RegisteredHeadersHash.gperf"
+    {"Link", Http::HdrType::LINK, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
+#line 87 "RegisteredHeadersHash.gperf"
     {"TE", Http::HdrType::TE, Http::HdrFieldType::ftStr, HdrKind::RequestHeader|HdrKind::HopByHopHeader},
-#line 48 "RegisteredHeadersHash.gperf"
-    {"Cookie", Http::HdrType::COOKIE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 50 "RegisteredHeadersHash.gperf"
+    {""},
+#line 51 "RegisteredHeadersHash.gperf"
     {"Date", Http::HdrType::DATE, Http::HdrFieldType::ftDate_1123, HdrKind::GeneralHeader},
-#line 87 "RegisteredHeadersHash.gperf"
-    {"Title", Http::HdrType::TITLE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 52 "RegisteredHeadersHash.gperf"
-    {"Expect", Http::HdrType::EXPECT, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
 #line 88 "RegisteredHeadersHash.gperf"
-    {"Trailer", Http::HdrType::TRAILER, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader},
+    {"Title", Http::HdrType::TITLE, Http::HdrFieldType::ftStr, HdrKind::None},
+#line 80 "RegisteredHeadersHash.gperf"
+    {"Range", Http::HdrType::RANGE, Http::HdrFieldType::ftPRange, HdrKind::RequestHeader},
 #line 31 "RegisteredHeadersHash.gperf"
     {"Age", Http::HdrType::AGE, Http::HdrFieldType::ftInt, HdrKind::ReplyHeader},
+#line 49 "RegisteredHeadersHash.gperf"
+    {"Cookie", Http::HdrType::COOKIE, Http::HdrFieldType::ftStr, HdrKind::None},
     {""},
-#line 78 "RegisteredHeadersHash.gperf"
-    {"Public", Http::HdrType::PUBLIC, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 81 "RegisteredHeadersHash.gperf"
-    {"Request-Range", Http::HdrType::REQUEST_RANGE, Http::HdrFieldType::ftPRange, HdrKind::None},
-#line 37 "RegisteredHeadersHash.gperf"
-    {"CDN-Loop", Http::HdrType::CDN_LOOP, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 90 "RegisteredHeadersHash.gperf"
-    {"Translate", Http::HdrType::TRANSLATE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 46 "RegisteredHeadersHash.gperf"
-    {"Content-Range", Http::HdrType::CONTENT_RANGE, Http::HdrFieldType::ftPContRange, HdrKind::EntityHeader},
-#line 82 "RegisteredHeadersHash.gperf"
-    {"Retry-After", Http::HdrType::RETRY_AFTER, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
 #line 39 "RegisteredHeadersHash.gperf"
-    {"Content-Base", Http::HdrType::CONTENT_BASE, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
+    {"Connection", Http::HdrType::CONNECTION, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
+#line 94 "RegisteredHeadersHash.gperf"
+    {"User-Agent", Http::HdrType::USER_AGENT, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
 #line 26 "RegisteredHeadersHash.gperf"
     {"Accept", Http::HdrType::ACCEPT, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 72 "RegisteredHeadersHash.gperf"
-    {"Pragma", Http::HdrType::PRAGMA, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 47 "RegisteredHeadersHash.gperf"
+#line 48 "RegisteredHeadersHash.gperf"
     {"Content-Type", Http::HdrType::CONTENT_TYPE, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
-#line 61 "RegisteredHeadersHash.gperf"
-    {"If-Range", Http::HdrType::IF_RANGE, Http::HdrFieldType::ftDate_1123_or_ETag, HdrKind::None},
-#line 70 "RegisteredHeadersHash.gperf"
-    {"Negotiate", Http::HdrType::NEGOTIATE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 67 "RegisteredHeadersHash.gperf"
+#line 57 "RegisteredHeadersHash.gperf"
+    {"Host", Http::HdrType::HOST, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
+#line 68 "RegisteredHeadersHash.gperf"
     {"Location", Http::HdrType::LOCATION, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 42 "RegisteredHeadersHash.gperf"
-    {"Content-Language", Http::HdrType::CONTENT_LANGUAGE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
-#line 83 "RegisteredHeadersHash.gperf"
-    {"Server", Http::HdrType::SERVER, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 53 "RegisteredHeadersHash.gperf"
-    {"Expires", Http::HdrType::EXPIRES, Http::HdrFieldType::ftDate_1123, HdrKind::EntityHeader},
-#line 49 "RegisteredHeadersHash.gperf"
+#line 77 "RegisteredHeadersHash.gperf"
+    {"Proxy-Connection", Http::HdrType::PROXY_CONNECTION, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
+#line 50 "RegisteredHeadersHash.gperf"
     {"Cookie2", Http::HdrType::COOKIE2, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 95 "RegisteredHeadersHash.gperf"
+#line 76 "RegisteredHeadersHash.gperf"
+    {"Proxy-Authorization", Http::HdrType::PROXY_AUTHORIZATION, Http::HdrFieldType::ftStr, HdrKind::RequestHeader|HdrKind::HopByHopHeader},
+#line 64 "RegisteredHeadersHash.gperf"
+    {"Keep-Alive", Http::HdrType::KEEP_ALIVE, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader},
+#line 74 "RegisteredHeadersHash.gperf"
+    {"Proxy-Authenticate", Http::HdrType::PROXY_AUTHENTICATE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
+#line 62 "RegisteredHeadersHash.gperf"
+    {"If-Range", Http::HdrType::IF_RANGE, Http::HdrFieldType::ftDate_1123_or_ETag, HdrKind::None},
+#line 79 "RegisteredHeadersHash.gperf"
+    {"Public", Http::HdrType::PUBLIC, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
+#line 40 "RegisteredHeadersHash.gperf"
+    {"Content-Base", Http::HdrType::CONTENT_BASE, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
+#line 58 "RegisteredHeadersHash.gperf"
+    {"HTTP2-Settings", Http::HdrType::HTTP2_SETTINGS, Http::HdrFieldType::ftStr, HdrKind::RequestHeader|HdrKind::HopByHopHeader},
+#line 75 "RegisteredHeadersHash.gperf"
+    {"Proxy-Authentication-Info", Http::HdrType::PROXY_AUTHENTICATION_INFO, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
+#line 35 "RegisteredHeadersHash.gperf"
+    {"Authorization", Http::HdrType::AUTHORIZATION, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
+#line 34 "RegisteredHeadersHash.gperf"
+    {"Authentication-Info", Http::HdrType::AUTHENTICATION_INFO, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
+    {""},
+#line 91 "RegisteredHeadersHash.gperf"
+    {"Translate", Http::HdrType::TRANSLATE, Http::HdrFieldType::ftStr, HdrKind::None},
+#line 103 "RegisteredHeadersHash.gperf"
+    {"X-Next-Services", Http::HdrType::X_NEXT_SERVICES, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
+#line 96 "RegisteredHeadersHash.gperf"
     {"Via", Http::HdrType::VIA, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 98 "RegisteredHeadersHash.gperf"
-    {"X-Cache", Http::HdrType::X_CACHE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
+#line 56 "RegisteredHeadersHash.gperf"
+    {"From", Http::HdrType::FROM, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
+#line 113 "RegisteredHeadersHash.gperf"
+    {"*INVALID*:", Http::HdrType::BAD_HDR, Http::HdrFieldType::ftInvalid, HdrKind::None},
 #line 73 "RegisteredHeadersHash.gperf"
-    {"Proxy-Authenticate", Http::HdrType::PROXY_AUTHENTICATE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 110 "RegisteredHeadersHash.gperf"
+    {"Pragma", Http::HdrType::PRAGMA, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
+#line 53 "RegisteredHeadersHash.gperf"
+    {"Expect", Http::HdrType::EXPECT, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
+    {""},
+#line 41 "RegisteredHeadersHash.gperf"
+    {"Content-Disposition", Http::HdrType::CONTENT_DISPOSITION, Http::HdrFieldType::ftStr, HdrKind::None},
+#line 38 "RegisteredHeadersHash.gperf"
+    {"CDN-Loop", Http::HdrType::CDN_LOOP, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
+#line 83 "RegisteredHeadersHash.gperf"
+    {"Retry-After", Http::HdrType::RETRY_AFTER, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
+#line 109 "RegisteredHeadersHash.gperf"
     {"FTP-Pre", Http::HdrType::FTP_PRE, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 77 "RegisteredHeadersHash.gperf"
+#line 29 "RegisteredHeadersHash.gperf"
+    {"Accept-Language", Http::HdrType::ACCEPT_LANGUAGE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
+#line 111 "RegisteredHeadersHash.gperf"
+    {"FTP-Reason", Http::HdrType::FTP_REASON, Http::HdrFieldType::ftStr, HdrKind::None},
+#line 98 "RegisteredHeadersHash.gperf"
+    {"WWW-Authenticate", Http::HdrType::WWW_AUTHENTICATE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
+#line 78 "RegisteredHeadersHash.gperf"
     {"Proxy-support", Http::HdrType::PROXY_SUPPORT, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
-#line 32 "RegisteredHeadersHash.gperf"
-    {"Allow", Http::HdrType::ALLOW, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
+#line 81 "RegisteredHeadersHash.gperf"
+    {"Referer", Http::HdrType::REFERER, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
+#line 47 "RegisteredHeadersHash.gperf"
+    {"Content-Range", Http::HdrType::CONTENT_RANGE, Http::HdrFieldType::ftPContRange, HdrKind::EntityHeader},
+#line 106 "RegisteredHeadersHash.gperf"
+    {"Front-End-Https", Http::HdrType::FRONT_END_HTTPS, Http::HdrFieldType::ftStr, HdrKind::None},
+#line 37 "RegisteredHeadersHash.gperf"
+    {"Cache-Status", Http::HdrType::CACHE_STATUS, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
+#line 30 "RegisteredHeadersHash.gperf"
+    {"Accept-Ranges", Http::HdrType::ACCEPT_RANGES, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
+#line 54 "RegisteredHeadersHash.gperf"
+    {"Expires", Http::HdrType::EXPIRES, Http::HdrFieldType::ftDate_1123, HdrKind::EntityHeader},
+#line 89 "RegisteredHeadersHash.gperf"
+    {"Trailer", Http::HdrType::TRAILER, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader},
+#line 45 "RegisteredHeadersHash.gperf"
+    {"Content-Location", Http::HdrType::CONTENT_LOCATION, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
+#line 70 "RegisteredHeadersHash.gperf"
+    {"Mime-Version", Http::HdrType::MIME_VERSION, Http::HdrFieldType::ftStr, HdrKind::GeneralHeader},
+#line 93 "RegisteredHeadersHash.gperf"
+    {"Upgrade", Http::HdrType::UPGRADE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
+#line 43 "RegisteredHeadersHash.gperf"
+    {"Content-Language", Http::HdrType::CONTENT_LANGUAGE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
 #line 33 "RegisteredHeadersHash.gperf"
     {"Alternate-Protocol", Http::HdrType::ALTERNATE_PROTOCOL, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader},
+#line 69 "RegisteredHeadersHash.gperf"
+    {"Max-Forwards", Http::HdrType::MAX_FORWARDS, Http::HdrFieldType::ftInt64, HdrKind::RequestHeader},
 #line 36 "RegisteredHeadersHash.gperf"
     {"Cache-Control", Http::HdrType::CACHE_CONTROL, Http::HdrFieldType::ftPCc, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 29 "RegisteredHeadersHash.gperf"
-    {"Accept-Language", Http::HdrType::ACCEPT_LANGUAGE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 97 "RegisteredHeadersHash.gperf"
-    {"WWW-Authenticate", Http::HdrType::WWW_AUTHENTICATE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 44 "RegisteredHeadersHash.gperf"
-    {"Content-Location", Http::HdrType::CONTENT_LOCATION, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
-#line 102 "RegisteredHeadersHash.gperf"
+#line 101 "RegisteredHeadersHash.gperf"
     {"X-Squid-Error", Http::HdrType::X_SQUID_ERROR, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
+#line 71 "RegisteredHeadersHash.gperf"
+    {"Negotiate", Http::HdrType::NEGOTIATE, Http::HdrFieldType::ftStr, HdrKind::None},
 #line 92 "RegisteredHeadersHash.gperf"
-    {"Upgrade", Http::HdrType::UPGRADE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
-#line 40 "RegisteredHeadersHash.gperf"
-    {"Content-Disposition", Http::HdrType::CONTENT_DISPOSITION, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 65 "RegisteredHeadersHash.gperf"
-    {"Last-Modified", Http::HdrType::LAST_MODIFIED, Http::HdrFieldType::ftDate_1123, HdrKind::EntityHeader},
-#line 56 "RegisteredHeadersHash.gperf"
-    {"Host", Http::HdrType::HOST, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 94 "RegisteredHeadersHash.gperf"
-    {"Vary", Http::HdrType::VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 75 "RegisteredHeadersHash.gperf"
-    {"Proxy-Authorization", Http::HdrType::PROXY_AUTHORIZATION, Http::HdrFieldType::ftStr, HdrKind::RequestHeader|HdrKind::HopByHopHeader},
-#line 106 "RegisteredHeadersHash.gperf"
-    {"Surrogate-Control", Http::HdrType::SURROGATE_CONTROL, Http::HdrFieldType::ftPSc, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 100 "RegisteredHeadersHash.gperf"
-    {"X-Forwarded-For", Http::HdrType::X_FORWARDED_FOR, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 35 "RegisteredHeadersHash.gperf"
-    {"Authorization", Http::HdrType::AUTHORIZATION, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 54 "RegisteredHeadersHash.gperf"
-    {"Forwarded", Http::HdrType::FORWARDED, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
-#line 76 "RegisteredHeadersHash.gperf"
-    {"Proxy-Connection", Http::HdrType::PROXY_CONNECTION, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
+    {"Unless-Modified-Since", Http::HdrType::UNLESS_MODIFIED_SINCE, Http::HdrFieldType::ftStr, HdrKind::None},
+#line 32 "RegisteredHeadersHash.gperf"
+    {"Allow", Http::HdrType::ALLOW, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
+#line 52 "RegisteredHeadersHash.gperf"
+    {"ETag", Http::HdrType::ETAG, Http::HdrFieldType::ftETag, HdrKind::EntityHeader},
+#line 42 "RegisteredHeadersHash.gperf"
+    {"Content-Encoding", Http::HdrType::CONTENT_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
+#line 72 "RegisteredHeadersHash.gperf"
+    {"Origin", Http::HdrType::ORIGIN, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
 #line 84 "RegisteredHeadersHash.gperf"
-    {"Set-Cookie", Http::HdrType::SET_COOKIE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
+    {"Server", Http::HdrType::SERVER, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
 #line 59 "RegisteredHeadersHash.gperf"
-    {"If-Modified-Since", Http::HdrType::IF_MODIFIED_SINCE, Http::HdrFieldType::ftDate_1123, HdrKind::RequestHeader},
+    {"If-Match", Http::HdrType::IF_MATCH, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
+#line 95 "RegisteredHeadersHash.gperf"
+    {"Vary", Http::HdrType::VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
+#line 28 "RegisteredHeadersHash.gperf"
+    {"Accept-Encoding", Http::HdrType::ACCEPT_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader|HdrKind::ReplyHeader},
+#line 27 "RegisteredHeadersHash.gperf"
+    {"Accept-Charset", Http::HdrType::ACCEPT_CHARSET, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
+#line 65 "RegisteredHeadersHash.gperf"
+    {"Key", Http::HdrType::KEY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
+#line 85 "RegisteredHeadersHash.gperf"
+    {"Set-Cookie", Http::HdrType::SET_COOKIE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
 #line 99 "RegisteredHeadersHash.gperf"
-    {"X-Cache-Lookup", Http::HdrType::X_CACHE_LOOKUP, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 62 "RegisteredHeadersHash.gperf"
-    {"If-Unmodified-Since", Http::HdrType::IF_UNMODIFIED_SINCE, Http::HdrFieldType::ftDate_1123, HdrKind::None},
-#line 71 "RegisteredHeadersHash.gperf"
-    {"Origin", Http::HdrType::ORIGIN, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 108 "RegisteredHeadersHash.gperf"
+    {"X-Forwarded-For", Http::HdrType::X_FORWARDED_FOR, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
+#line 110 "RegisteredHeadersHash.gperf"
+    {"FTP-Status", Http::HdrType::FTP_STATUS, Http::HdrFieldType::ftInt, HdrKind::None},
+#line 82 "RegisteredHeadersHash.gperf"
+    {"Request-Range", Http::HdrType::REQUEST_RANGE, Http::HdrFieldType::ftPRange, HdrKind::None},
+#line 107 "RegisteredHeadersHash.gperf"
     {"FTP-Command", Http::HdrType::FTP_COMMAND, Http::HdrFieldType::ftStr, HdrKind::None},
 #line 55 "RegisteredHeadersHash.gperf"
-    {"From", Http::HdrType::FROM, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 30 "RegisteredHeadersHash.gperf"
-    {"Accept-Ranges", Http::HdrType::ACCEPT_RANGES, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 58 "RegisteredHeadersHash.gperf"
-    {"If-Match", Http::HdrType::IF_MATCH, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 43 "RegisteredHeadersHash.gperf"
-    {"Content-Length", Http::HdrType::CONTENT_LENGTH, Http::HdrFieldType::ftInt64, HdrKind::EntityHeader},
-#line 51 "RegisteredHeadersHash.gperf"
-    {"ETag", Http::HdrType::ETAG, Http::HdrFieldType::ftETag, HdrKind::EntityHeader},
-#line 113 "RegisteredHeadersHash.gperf"
+    {"Forwarded", Http::HdrType::FORWARDED, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader},
+#line 112 "RegisteredHeadersHash.gperf"
     {"Other:", Http::HdrType::OTHER, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
-#line 101 "RegisteredHeadersHash.gperf"
-    {"X-Request-URI", Http::HdrType::X_REQUEST_URI, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 66 "RegisteredHeadersHash.gperf"
-    {"Link", Http::HdrType::LINK, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
-#line 104 "RegisteredHeadersHash.gperf"
-    {"X-Next-Services", Http::HdrType::X_NEXT_SERVICES, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 38 "RegisteredHeadersHash.gperf"
-    {"Connection", Http::HdrType::CONNECTION, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
-#line 93 "RegisteredHeadersHash.gperf"
-    {"User-Agent", Http::HdrType::USER_AGENT, Http::HdrFieldType::ftStr, HdrKind::RequestHeader},
-#line 27 "RegisteredHeadersHash.gperf"
-    {"Accept-Charset", Http::HdrType::ACCEPT_CHARSET, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 105 "RegisteredHeadersHash.gperf"
-    {"Surrogate-Capability", Http::HdrType::SURROGATE_CAPABILITY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
-#line 103 "RegisteredHeadersHash.gperf"
-    {"X-Accelerator-Vary", Http::HdrType::HDR_X_ACCELERATOR_VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 45 "RegisteredHeadersHash.gperf"
+#line 46 "RegisteredHeadersHash.gperf"
     {"Content-MD5", Http::HdrType::CONTENT_MD5, Http::HdrFieldType::ftStr, HdrKind::EntityHeader},
-#line 34 "RegisteredHeadersHash.gperf"
-    {"Authentication-Info", Http::HdrType::AUTHENTICATION_INFO, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
-#line 107 "RegisteredHeadersHash.gperf"
-    {"Front-End-Https", Http::HdrType::FRONT_END_HTTPS, Http::HdrFieldType::ftStr, HdrKind::None},
-#line 85 "RegisteredHeadersHash.gperf"
-    {"Set-Cookie2", Http::HdrType::SET_COOKIE2, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
-#line 68 "RegisteredHeadersHash.gperf"
-    {"Max-Forwards", Http::HdrType::MAX_FORWARDS, Http::HdrFieldType::ftInt64, HdrKind::RequestHeader},
-#line 114 "RegisteredHeadersHash.gperf"
-    {"*INVALID*:", Http::HdrType::BAD_HDR, Http::HdrFieldType::ftInvalid, HdrKind::None},
-#line 74 "RegisteredHeadersHash.gperf"
-    {"Proxy-Authentication-Info", Http::HdrType::PROXY_AUTHENTICATION_INFO, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
-#line 69 "RegisteredHeadersHash.gperf"
-    {"Mime-Version", Http::HdrType::MIME_VERSION, Http::HdrFieldType::ftStr, HdrKind::GeneralHeader},
-    {""},
-#line 41 "RegisteredHeadersHash.gperf"
-    {"Content-Encoding", Http::HdrType::CONTENT_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader},
-#line 57 "RegisteredHeadersHash.gperf"
-    {"HTTP2-Settings", Http::HdrType::HTTP2_SETTINGS, Http::HdrFieldType::ftStr, HdrKind::RequestHeader|HdrKind::HopByHopHeader},
-    {""},
-#line 64 "RegisteredHeadersHash.gperf"
-    {"Key", Http::HdrType::KEY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 89 "RegisteredHeadersHash.gperf"
-    {"Transfer-Encoding", Http::HdrType::TRANSFER_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
     {""},
-#line 96 "RegisteredHeadersHash.gperf"
+#line 86 "RegisteredHeadersHash.gperf"
+    {"Set-Cookie2", Http::HdrType::SET_COOKIE2, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
+#line 97 "RegisteredHeadersHash.gperf"
     {"Warning", Http::HdrType::WARNING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
-#line 63 "RegisteredHeadersHash.gperf"
-    {"Keep-Alive", Http::HdrType::KEEP_ALIVE, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader},
-    {""}, {""}, {""}, {""},
-#line 112 "RegisteredHeadersHash.gperf"
-    {"FTP-Reason", Http::HdrType::FTP_REASON, Http::HdrFieldType::ftStr, HdrKind::None},
-    {""},
-#line 109 "RegisteredHeadersHash.gperf"
+    {""}, {""}, {""},
+#line 108 "RegisteredHeadersHash.gperf"
     {"FTP-Arguments", Http::HdrType::FTP_ARGUMENTS, Http::HdrFieldType::ftStr, HdrKind::None},
+#line 105 "RegisteredHeadersHash.gperf"
+    {"Surrogate-Control", Http::HdrType::SURROGATE_CONTROL, Http::HdrFieldType::ftPSc, HdrKind::ListHeader|HdrKind::ReplyHeader},
+#line 104 "RegisteredHeadersHash.gperf"
+    {"Surrogate-Capability", Http::HdrType::SURROGATE_CAPABILITY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader},
+#line 90 "RegisteredHeadersHash.gperf"
+    {"Transfer-Encoding", Http::HdrType::TRANSFER_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader},
     {""}, {""},
 #line 60 "RegisteredHeadersHash.gperf"
+    {"If-Modified-Since", Http::HdrType::IF_MODIFIED_SINCE, Http::HdrFieldType::ftDate_1123, HdrKind::RequestHeader},
+    {""},
+#line 63 "RegisteredHeadersHash.gperf"
+    {"If-Unmodified-Since", Http::HdrType::IF_UNMODIFIED_SINCE, Http::HdrFieldType::ftDate_1123, HdrKind::None},
+    {""}, {""}, {""},
+#line 102 "RegisteredHeadersHash.gperf"
+    {"X-Accelerator-Vary", Http::HdrType::HDR_X_ACCELERATOR_VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader},
+#line 44 "RegisteredHeadersHash.gperf"
+    {"Content-Length", Http::HdrType::CONTENT_LENGTH, Http::HdrFieldType::ftInt64, HdrKind::EntityHeader},
+    {""}, {""},
+#line 61 "RegisteredHeadersHash.gperf"
     {"If-None-Match", Http::HdrType::IF_NONE_MATCH, Http::HdrFieldType::ftStr, HdrKind::ListHeader},
-#line 91 "RegisteredHeadersHash.gperf"
-    {"Unless-Modified-Since", Http::HdrType::UNLESS_MODIFIED_SINCE, Http::HdrFieldType::ftStr, HdrKind::None},
+#line 100 "RegisteredHeadersHash.gperf"
+    {"X-Request-URI", Http::HdrType::X_REQUEST_URI, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader},
     {""},
-#line 111 "RegisteredHeadersHash.gperf"
-    {"FTP-Status", Http::HdrType::FTP_STATUS, Http::HdrFieldType::ftInt, HdrKind::None},
-#line 28 "RegisteredHeadersHash.gperf"
-    {"Accept-Encoding", Http::HdrType::ACCEPT_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader|HdrKind::ReplyHeader}
+#line 66 "RegisteredHeadersHash.gperf"
+    {"Last-Modified", Http::HdrType::LAST_MODIFIED, Http::HdrFieldType::ftDate_1123, HdrKind::EntityHeader}
 };
 
 const struct HeaderTableRecord *
@@ -383,5 +381,5 @@ HttpHeaderHashTable::lookup (const char *str, size_t len)
     }
     return 0;
 }
-#line 115 "RegisteredHeadersHash.gperf"
+#line 114 "RegisteredHeadersHash.gperf"
 
index 64e6e4dda606623c22143996ed379820502d43c0..1f70c2e0087d8b1b48ede133410840576d829a90 100644 (file)
@@ -34,6 +34,7 @@ Alternate-Protocol, Http::HdrType::ALTERNATE_PROTOCOL, Http::HdrFieldType::ftStr
 Authentication-Info, Http::HdrType::AUTHENTICATION_INFO, Http::HdrFieldType::ftStr, HdrKind::ListHeader
 Authorization, Http::HdrType::AUTHORIZATION, Http::HdrFieldType::ftStr, HdrKind::RequestHeader
 Cache-Control, Http::HdrType::CACHE_CONTROL, Http::HdrFieldType::ftPCc, HdrKind::ListHeader|HdrKind::GeneralHeader
+Cache-Status, Http::HdrType::CACHE_STATUS, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader
 CDN-Loop, Http::HdrType::CDN_LOOP, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader
 Connection, Http::HdrType::CONNECTION, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader
 Content-Base, Http::HdrType::CONTENT_BASE, Http::HdrFieldType::ftStr, HdrKind::EntityHeader
@@ -95,8 +96,6 @@ Vary, Http::HdrType::VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKin
 Via, Http::HdrType::VIA, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader
 Warning, Http::HdrType::WARNING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader
 WWW-Authenticate, Http::HdrType::WWW_AUTHENTICATE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader
-X-Cache, Http::HdrType::X_CACHE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader
-X-Cache-Lookup, Http::HdrType::X_CACHE_LOOKUP, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader
 X-Forwarded-For, Http::HdrType::X_FORWARDED_FOR, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader
 X-Request-URI, Http::HdrType::X_REQUEST_URI, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader
 X-Squid-Error, Http::HdrType::X_SQUID_ERROR, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader