From: Amos Jeffries Date: Fri, 28 Aug 2020 18:47:04 +0000 (+0000) Subject: Replaced X-Cache and X-Cache-Lookup headers with Cache-Status (#705) X-Git-Tag: 4.15-20210522-snapshot~65 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5fdc549054b11eb8bbc7e9640d6d071fa1ef742b;p=thirdparty%2Fsquid.git Replaced X-Cache and X-Cache-Lookup headers with Cache-Status (#705) 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. --- diff --git a/src/LogTags.cc b/src/LogTags.cc index 4c9616b98a..49d0579241 100644 --- a/src/LogTags.cc +++ b/src/LogTags.cc @@ -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; +} + diff --git a/src/LogTags.h b/src/LogTags.h index 5d9dbe4e48..e5732765ff 100644 --- a/src/LogTags.h +++ b/src/LogTags.h @@ -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. diff --git a/src/client_side_reply.cc b/src/client_side_reply.cc index 7830e4e43d..c9191049bf 100644 --- a/src/client_side_reply.cc +++ b/src/client_side_reply.cc @@ -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. diff --git a/src/client_side_reply.h b/src/client_side_reply.h index 8678f538bd..b55a18aa36 100644 --- a/src/client_side_reply.h +++ b/src/client_side_reply.h @@ -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; diff --git a/src/http/RegisteredHeaders.h b/src/http/RegisteredHeaders.h index 36dcd33a84..3b09a481fb 100644 --- a/src/http/RegisteredHeaders.h +++ b/src/http/RegisteredHeaders.h @@ -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 */ diff --git a/src/http/RegisteredHeadersHash.cci b/src/http/RegisteredHeadersHash.cci index b309281e44..aee8c808b8 100644 --- a/src/http/RegisteredHeadersHash.cci +++ b/src/http/RegisteredHeadersHash.cci @@ -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) \ @@ -44,14 +44,14 @@ 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(str[2])]; + /*FALLTHROUGH*/ case 2: - case 1: - hval += asso_values[static_cast(str[0])]; break; } return hval + asso_values[static_cast(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" diff --git a/src/http/RegisteredHeadersHash.gperf b/src/http/RegisteredHeadersHash.gperf index 64e6e4dda6..1f70c2e008 100644 --- a/src/http/RegisteredHeadersHash.gperf +++ b/src/http/RegisteredHeadersHash.gperf @@ -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