Local caching for GitHub Actions self hosted runner using Squid Proxy

23 min read Original article ↗
class Squid < Formula desc "Advanced proxy caching server for HTTP, HTTPS, FTP, and Gopher" homepage "http://www.squid-cache.org/" url "http://www.squid-cache.org/Versions/v5/squid-5.6.tar.xz" sha256 "38d27338a347597ce0e93d0c3be6e5f66b6750417c474ca87ee0d61bb6d148db" license "GPL-2.0-or-later" livecheck do url "http://www.squid-cache.org/Versions/v5/" regex(/href=.*?squid[._-]v?(\d+(?:\.\d+)+)-RELEASENOTES\.html/i) end head do url "lp:squid", using: :bzr depends_on "autoconf" => :build depends_on "automake" => :build depends_on "libtool" => :build end depends_on "openssl@1.1" def install # https://stackoverflow.com/questions/20910109/building-squid-cache-on-os-x-mavericks ENV.append "LDFLAGS", "-lresolv" # For --disable-eui, see: # http://www.squid-cache.org/mail-archive/squid-users/201304/0040.html args = %W[ --disable-debug --disable-dependency-tracking --prefix=#{prefix} --localstatedir=#{var} --sysconfdir=#{etc} --enable-ssl --enable-ssl-crtd --disable-eui --enable-pf-transparent --with-included-ltdl --with-openssl --enable-delay-pools --enable-disk-io=yes --enable-removal-policies=yes --enable-storeio=yes --disable-strict-error-checking ] system "./bootstrap.sh" if build.head? system "./configure", *args system "make", "install" end service do run [opt_sbin/"squid", "-N", "-d 1"] keep_alive true working_dir var end test do assert_match version.to_s, shell_output("#{sbin}/squid -v") pid = fork do exec "#{sbin}/squid" end sleep 2 begin system "#{sbin}/squid", "-k", "check" ensure exec "#{sbin}/squid -k interrupt" Process.wait(pid) end end patch :DATA end __END__ diff -Naur a/src/HttpHeader.cc b/src/HttpHeader.cc --- a/src/HttpHeader.cc 2022-06-05 15:11:52.000000000 -0700 +++ b/src/HttpHeader.cc 2022-08-12 20:20:34.000000000 -0700 @@ -290,7 +290,8 @@ (id == Http::HdrType::WARNING) || // TODO: Consider updating Vary headers after comparing the magnitude of // the required changes (and/or cache losses) with compliance gains. - (id == Http::HdrType::VARY); + (id == Http::HdrType::VARY) || + (id == Http::HdrType::CONTENT_LENGTH); } void @@ -1274,7 +1275,8 @@ * hopefully no clients send mismatched headers! */ if ((e = findEntry(Http::HdrType::RANGE)) || - (e = findEntry(Http::HdrType::REQUEST_RANGE))) { + (e = findEntry(Http::HdrType::REQUEST_RANGE)) || + (e = findEntry(Http::HdrType::X_MS_RANGE))) { r = HttpHdrRange::ParseCreate(&e->value); httpHeaderNoteParsedEntry(e->id, e->value, !r); } diff -Naur a/src/client_side_reply.cc b/src/client_side_reply.cc --- a/src/client_side_reply.cc 2022-06-05 15:11:52.000000000 -0700 +++ b/src/client_side_reply.cc 2022-08-12 16:08:02.000000000 -0700 @@ -1942,8 +1942,10 @@ clientReplyContext::pushStreamData(StoreIOBuffer const &result, char *source) { StoreIOBuffer localTempBuffer; + const int64_t expectedBodySize = + http->storeEntry()->mem().baseReply().bodySize(http->request->method); - if (result.length == 0) { + if (result.length == 0 && result.offset - headers_sz != expectedBodySize) { debugs(88, 5, "clientReplyContext::pushStreamData: marking request as complete due to 0 length store result"); flags.complete = 1; } diff -Naur a/src/client_side_request.cc b/src/client_side_request.cc --- a/src/client_side_request.cc 2022-06-05 15:11:52.000000000 -0700 +++ b/src/client_side_request.cc 2022-08-12 15:42:43.000000000 -0700 @@ -1098,6 +1098,7 @@ else { req_hdr->delById(Http::HdrType::RANGE); req_hdr->delById(Http::HdrType::REQUEST_RANGE); + req_hdr->delById(Http::HdrType::X_MS_RANGE); request->ignoreRange("neither HEAD nor GET"); } diff -Naur a/src/http/RegisteredHeaders.h b/src/http/RegisteredHeaders.h --- a/src/http/RegisteredHeaders.h 2022-06-05 15:11:52.000000000 -0700 +++ b/src/http/RegisteredHeaders.h 2022-08-11 10:59:26.000000000 -0700 @@ -111,6 +111,7 @@ X_SQUID_ERROR, /**< Squid custom header on generated error responses */ HDR_X_ACCELERATOR_VARY, /**< obsolete Squid custom header. */ X_NEXT_SERVICES, /**< Squid custom ICAP header */ + X_MS_RANGE, /**< Used by Azure clients */ SURROGATE_CAPABILITY, /**< Edge Side Includes (ESI) header */ SURROGATE_CONTROL, /**< Edge Side Includes (ESI) header */ FRONT_END_HTTPS, /**< MS Exchange custom header we may have to add */ diff -Naur a/src/http/RegisteredHeadersHash.cci b/src/http/RegisteredHeadersHash.cci --- a/src/http/RegisteredHeadersHash.cci 2022-06-05 15:11:52.000000000 -0700 +++ b/src/http/RegisteredHeadersHash.cci 2022-08-11 11:03:30.000000000 -0700 @@ -1,32 +1,32 @@ -/* C++ code produced by gperf version 3.1 */ -/* Command-line: gperf -m 100000 RegisteredHeadersHash.gperf */ +/* C++ code produced by gperf version 3.0.3 */ +/* Command-line: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf --output-file=RegisteredHeadersHash.cci -m 100000 RegisteredHeadersHash.gperf */ /* Computed positions: -k'1,9,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ -&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ -&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ -&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ -&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ -&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ -&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ -&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ -&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ -&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ -&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ -&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ -&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ -&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ -&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ -&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ -&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ -&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ -&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ -&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ -&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ -&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ -&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ -#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gperf@gnu.org>." +#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>." #endif #line 1 "RegisteredHeadersHash.gperf" @@ -42,26 +42,26 @@ */ #line 24 "RegisteredHeadersHash.gperf" class HeaderTableRecord; - enum -{ - TOTAL_KEYWORDS = 89, +enum + { + TOTAL_KEYWORDS = 90, MIN_WORD_LENGTH = 2, MAX_WORD_LENGTH = 25, - MIN_HASH_VALUE = 13, - MAX_HASH_VALUE = 114 -}; + MIN_HASH_VALUE = 7, + MAX_HASH_VALUE = 115 + }; -/* maximum key range = 102, duplicates = 0 */ +/* maximum key range = 109, duplicates = 0 */ #ifndef GPERF_DOWNCASE #define GPERF_DOWNCASE 1 static unsigned char gperf_downcase[256] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, @@ -75,107 +75,106 @@ 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 -}; + }; #endif #ifndef GPERF_CASE_MEMCMP #define GPERF_CASE_MEMCMP 1 static int -gperf_case_memcmp (const char *s1, const char *s2, size_t n) +gperf_case_memcmp (register const char *s1, register const char *s2, register unsigned int n) { - for (; n > 0;) + for (; n > 0;) { - unsigned char c1 = gperf_downcase[(unsigned char)*s1++]; - unsigned char c2 = gperf_downcase[(unsigned char)*s2++]; - if (c1 == c2) + unsigned char c1 = gperf_downcase[(unsigned char)*s1++]; + unsigned char c2 = gperf_downcase[(unsigned char)*s2++]; + if (c1 == c2) { - n--; - continue; + n--; + continue; } - return (int)c1 - (int)c2; + return (int)c1 - (int)c2; } - return 0; + return 0; } #endif class HttpHeaderHashTable { private: - static inline unsigned int HttpHeaderHash (const char *str, size_t len); + static inline unsigned int HttpHeaderHash (const char *str, unsigned int len); public: - static const class HeaderTableRecord *lookup (const char *str, size_t len); + static const class HeaderTableRecord *lookup (const char *str, unsigned int len); }; inline unsigned int -HttpHeaderHashTable::HttpHeaderHash (const char *str, size_t len) +HttpHeaderHashTable::HttpHeaderHash (register const char *str, register unsigned int len) { - static const unsigned char asso_values[] = + 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 + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 2, 116, 116, 33, 116, 116, 116, 116, + 64, 116, 116, 3, 116, 116, 116, 116, 20, 116, + 116, 116, 116, 116, 116, 18, 13, 4, 7, 1, + 36, 28, 35, 20, 116, 43, 24, 30, 6, 53, + 11, 116, 1, 20, 7, 18, 33, 65, 17, 45, + 116, 116, 116, 116, 116, 116, 116, 18, 13, 4, + 7, 1, 36, 28, 35, 20, 116, 43, 24, 30, + 6, 53, 11, 116, 1, 20, 7, 18, 33, 65, + 17, 45, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116 }; - unsigned int hval = len; + register unsigned int hval = len; - switch (hval) + switch (hval) { - default: - hval += asso_values[static_cast<unsigned char>(str[8])]; - /*FALLTHROUGH*/ - case 8: - case 7: - case 6: - case 5: - case 4: - case 3: - case 2: - case 1: - hval += asso_values[static_cast<unsigned char>(str[0])]; + default: + hval += asso_values[(unsigned char)str[8]]; + /*FALLTHROUGH*/ + case 8: + case 7: + case 6: + case 5: + case 4: + case 3: + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; break; } - return hval + asso_values[static_cast<unsigned char>(str[len - 1])]; + return hval + asso_values[(unsigned char)str[len - 1]]; } 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, 0, 0, 5, 0, 7, 2, 6, 4, 5, + 6, 7, 13, 9, 9, 13, 11, 6, 3, 8, 12, 7, 7, 6, + 7, 8, 12, 6, 13, 4, 10, 6, 19, 18, 8, 16, 15, 10, + 13, 19, 7, 16, 4, 13, 11, 16, 16, 10, 15, 15, 3, 13, + 10, 13, 17, 9, 19, 18, 17, 8, 13, 6, 14, 15, 12, 13, + 4, 4, 11, 10, 14, 7, 14, 14, 15, 6, 12, 18, 4, 16, + 10, 17, 20, 10, 5, 0, 0, 3, 0, 21, 19, 0, 25, 0, + 13, 13, 7, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11 + }; static const class HeaderTableRecord HttpHeaderDefinitionsTable[] = -{ - {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, - {""}, {""}, {""}, {""}, + { + {""}, {""}, {""}, {""}, {""}, {""}, {""}, #line 79 "RegisteredHeadersHash.gperf" {"Range", Http::HdrType::RANGE, Http::HdrFieldType::ftPRange, HdrKind::RequestHeader}, {""}, @@ -193,195 +192,195 @@ {"Expect", Http::HdrType::EXPECT, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader}, #line 88 "RegisteredHeadersHash.gperf" {"Trailer", Http::HdrType::TRAILER, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader}, -#line 31 "RegisteredHeadersHash.gperf" - {"Age", Http::HdrType::AGE, Http::HdrFieldType::ftInt, HdrKind::ReplyHeader}, - {""}, -#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 70 "RegisteredHeadersHash.gperf" + {"Negotiate", Http::HdrType::NEGOTIATE, Http::HdrFieldType::ftStr, HdrKind::None}, #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}, -#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 78 "RegisteredHeadersHash.gperf" + {"Public", Http::HdrType::PUBLIC, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, +#line 31 "RegisteredHeadersHash.gperf" + {"Age", Http::HdrType::AGE, Http::HdrFieldType::ftInt, HdrKind::ReplyHeader}, +#line 37 "RegisteredHeadersHash.gperf" + {"CDN-Loop", Http::HdrType::CDN_LOOP, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader}, #line 47 "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" - {"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 98 "RegisteredHeadersHash.gperf" + {"X-Cache", Http::HdrType::X_CACHE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, +#line 92 "RegisteredHeadersHash.gperf" + {"Upgrade", Http::HdrType::UPGRADE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader}, #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" - {"Cookie2", Http::HdrType::COOKIE2, Http::HdrFieldType::ftStr, HdrKind::None}, -#line 95 "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 61 "RegisteredHeadersHash.gperf" + {"If-Range", Http::HdrType::IF_RANGE, Http::HdrFieldType::ftDate_1123_or_ETag, HdrKind::None}, +#line 39 "RegisteredHeadersHash.gperf" + {"Content-Base", Http::HdrType::CONTENT_BASE, Http::HdrFieldType::ftStr, HdrKind::EntityHeader}, +#line 26 "RegisteredHeadersHash.gperf" + {"Accept", Http::HdrType::ACCEPT, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader}, +#line 102 "RegisteredHeadersHash.gperf" + {"X-Squid-Error", Http::HdrType::X_SQUID_ERROR, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, +#line 51 "RegisteredHeadersHash.gperf" + {"ETag", Http::HdrType::ETAG, Http::HdrFieldType::ftETag, HdrKind::EntityHeader}, +#line 115 "RegisteredHeadersHash.gperf" + {"*INVALID*:", Http::HdrType::BAD_HDR, Http::HdrFieldType::ftInvalid, HdrKind::None}, +#line 72 "RegisteredHeadersHash.gperf" + {"Pragma", Http::HdrType::PRAGMA, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader}, +#line 40 "RegisteredHeadersHash.gperf" + {"Content-Disposition", Http::HdrType::CONTENT_DISPOSITION, Http::HdrFieldType::ftStr, HdrKind::None}, #line 73 "RegisteredHeadersHash.gperf" {"Proxy-Authenticate", Http::HdrType::PROXY_AUTHENTICATE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, -#line 110 "RegisteredHeadersHash.gperf" - {"FTP-Pre", Http::HdrType::FTP_PRE, Http::HdrFieldType::ftStr, HdrKind::None}, +#line 67 "RegisteredHeadersHash.gperf" + {"Location", Http::HdrType::LOCATION, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, +#line 76 "RegisteredHeadersHash.gperf" + {"Proxy-Connection", Http::HdrType::PROXY_CONNECTION, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader}, +#line 100 "RegisteredHeadersHash.gperf" + {"X-Forwarded-For", Http::HdrType::X_FORWARDED_FOR, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader}, +#line 93 "RegisteredHeadersHash.gperf" + {"User-Agent", Http::HdrType::USER_AGENT, Http::HdrFieldType::ftStr, HdrKind::RequestHeader}, #line 77 "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 33 "RegisteredHeadersHash.gperf" - {"Alternate-Protocol", Http::HdrType::ALTERNATE_PROTOCOL, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader}, +#line 75 "RegisteredHeadersHash.gperf" + {"Proxy-Authorization", Http::HdrType::PROXY_AUTHORIZATION, Http::HdrFieldType::ftStr, HdrKind::RequestHeader|HdrKind::HopByHopHeader}, +#line 111 "RegisteredHeadersHash.gperf" + {"FTP-Pre", Http::HdrType::FTP_PRE, Http::HdrFieldType::ftStr, HdrKind::None}, +#line 42 "RegisteredHeadersHash.gperf" + {"Content-Language", Http::HdrType::CONTENT_LANGUAGE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader}, +#line 56 "RegisteredHeadersHash.gperf" + {"Host", Http::HdrType::HOST, Http::HdrFieldType::ftStr, 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 45 "RegisteredHeadersHash.gperf" + {"Content-MD5", Http::HdrType::CONTENT_MD5, Http::HdrFieldType::ftStr, HdrKind::EntityHeader}, +#line 41 "RegisteredHeadersHash.gperf" + {"Content-Encoding", Http::HdrType::CONTENT_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader}, #line 44 "RegisteredHeadersHash.gperf" {"Content-Location", Http::HdrType::CONTENT_LOCATION, Http::HdrFieldType::ftStr, HdrKind::EntityHeader}, -#line 102 "RegisteredHeadersHash.gperf" - {"X-Squid-Error", Http::HdrType::X_SQUID_ERROR, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, -#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}, #line 84 "RegisteredHeadersHash.gperf" {"Set-Cookie", Http::HdrType::SET_COOKIE, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, +#line 29 "RegisteredHeadersHash.gperf" + {"Accept-Language", Http::HdrType::ACCEPT_LANGUAGE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader}, +#line 104 "RegisteredHeadersHash.gperf" + {"X-Next-Services", Http::HdrType::X_NEXT_SERVICES, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader}, +#line 95 "RegisteredHeadersHash.gperf" + {"Via", Http::HdrType::VIA, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader}, +#line 35 "RegisteredHeadersHash.gperf" + {"Authorization", Http::HdrType::AUTHORIZATION, Http::HdrFieldType::ftStr, HdrKind::RequestHeader}, +#line 105 "RegisteredHeadersHash.gperf" + {"x-ms-range", Http::HdrType::X_MS_RANGE, Http::HdrFieldType::ftPRange, HdrKind::None}, +#line 101 "RegisteredHeadersHash.gperf" + {"X-Request-URI", Http::HdrType::X_REQUEST_URI, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, #line 59 "RegisteredHeadersHash.gperf" {"If-Modified-Since", Http::HdrType::IF_MODIFIED_SINCE, Http::HdrFieldType::ftDate_1123, HdrKind::RequestHeader}, -#line 99 "RegisteredHeadersHash.gperf" - {"X-Cache-Lookup", Http::HdrType::X_CACHE_LOOKUP, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, +#line 54 "RegisteredHeadersHash.gperf" + {"Forwarded", Http::HdrType::FORWARDED, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader}, #line 62 "RegisteredHeadersHash.gperf" {"If-Unmodified-Since", Http::HdrType::IF_UNMODIFIED_SINCE, Http::HdrFieldType::ftDate_1123, HdrKind::None}, +#line 33 "RegisteredHeadersHash.gperf" + {"Alternate-Protocol", Http::HdrType::ALTERNATE_PROTOCOL, Http::HdrFieldType::ftStr, HdrKind::HopByHopHeader}, +#line 107 "RegisteredHeadersHash.gperf" + {"Surrogate-Control", Http::HdrType::SURROGATE_CONTROL, Http::HdrFieldType::ftPSc, HdrKind::ListHeader|HdrKind::ReplyHeader}, +#line 58 "RegisteredHeadersHash.gperf" + {"If-Match", Http::HdrType::IF_MATCH, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader}, +#line 65 "RegisteredHeadersHash.gperf" + {"Last-Modified", Http::HdrType::LAST_MODIFIED, Http::HdrFieldType::ftDate_1123, HdrKind::EntityHeader}, #line 71 "RegisteredHeadersHash.gperf" {"Origin", Http::HdrType::ORIGIN, Http::HdrFieldType::ftStr, HdrKind::RequestHeader}, -#line 108 "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 99 "RegisteredHeadersHash.gperf" + {"X-Cache-Lookup", Http::HdrType::X_CACHE_LOOKUP, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader}, +#line 28 "RegisteredHeadersHash.gperf" + {"Accept-Encoding", Http::HdrType::ACCEPT_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader|HdrKind::ReplyHeader}, +#line 69 "RegisteredHeadersHash.gperf" + {"Mime-Version", Http::HdrType::MIME_VERSION, Http::HdrFieldType::ftStr, HdrKind::GeneralHeader}, #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" - {"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 55 "RegisteredHeadersHash.gperf" + {"From", Http::HdrType::FROM, Http::HdrFieldType::ftStr, HdrKind::RequestHeader}, #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 109 "RegisteredHeadersHash.gperf" + {"FTP-Command", Http::HdrType::FTP_COMMAND, Http::HdrFieldType::ftStr, HdrKind::None}, #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" - {"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" +#line 49 "RegisteredHeadersHash.gperf" + {"Cookie2", Http::HdrType::COOKIE2, Http::HdrFieldType::ftStr, HdrKind::None}, +#line 57 "RegisteredHeadersHash.gperf" + {"HTTP2-Settings", Http::HdrType::HTTP2_SETTINGS, Http::HdrFieldType::ftStr, HdrKind::RequestHeader|HdrKind::HopByHopHeader}, +#line 43 "RegisteredHeadersHash.gperf" + {"Content-Length", Http::HdrType::CONTENT_LENGTH, Http::HdrFieldType::ftInt64, HdrKind::EntityHeader}, +#line 108 "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 114 "RegisteredHeadersHash.gperf" + {"Other:", Http::HdrType::OTHER, Http::HdrFieldType::ftStr, HdrKind::EntityHeader}, #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 103 "RegisteredHeadersHash.gperf" + {"X-Accelerator-Vary", Http::HdrType::HDR_X_ACCELERATOR_VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader}, +#line 94 "RegisteredHeadersHash.gperf" + {"Vary", Http::HdrType::VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader}, +#line 97 "RegisteredHeadersHash.gperf" + {"WWW-Authenticate", Http::HdrType::WWW_AUTHENTICATE, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader}, +#line 112 "RegisteredHeadersHash.gperf" + {"FTP-Status", Http::HdrType::FTP_STATUS, Http::HdrFieldType::ftInt, HdrKind::None}, #line 89 "RegisteredHeadersHash.gperf" {"Transfer-Encoding", Http::HdrType::TRANSFER_ENCODING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::GeneralHeader|HdrKind::HopByHopHeader}, - {""}, -#line 96 "RegisteredHeadersHash.gperf" - {"Warning", Http::HdrType::WARNING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader}, +#line 106 "RegisteredHeadersHash.gperf" + {"Surrogate-Capability", Http::HdrType::SURROGATE_CAPABILITY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader}, #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" - {"FTP-Arguments", Http::HdrType::FTP_ARGUMENTS, Http::HdrFieldType::ftStr, HdrKind::None}, +#line 32 "RegisteredHeadersHash.gperf" + {"Allow", Http::HdrType::ALLOW, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::EntityHeader}, {""}, {""}, -#line 60 "RegisteredHeadersHash.gperf" - {"If-None-Match", Http::HdrType::IF_NONE_MATCH, Http::HdrFieldType::ftStr, HdrKind::ListHeader}, +#line 64 "RegisteredHeadersHash.gperf" + {"Key", Http::HdrType::KEY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader}, + {""}, #line 91 "RegisteredHeadersHash.gperf" {"Unless-Modified-Since", Http::HdrType::UNLESS_MODIFIED_SINCE, Http::HdrFieldType::ftStr, HdrKind::None}, +#line 34 "RegisteredHeadersHash.gperf" + {"Authentication-Info", Http::HdrType::AUTHENTICATION_INFO, Http::HdrFieldType::ftStr, HdrKind::ListHeader}, {""}, -#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 74 "RegisteredHeadersHash.gperf" + {"Proxy-Authentication-Info", Http::HdrType::PROXY_AUTHENTICATION_INFO, Http::HdrFieldType::ftStr, HdrKind::ListHeader}, + {""}, +#line 60 "RegisteredHeadersHash.gperf" + {"If-None-Match", Http::HdrType::IF_NONE_MATCH, Http::HdrFieldType::ftStr, HdrKind::ListHeader}, +#line 110 "RegisteredHeadersHash.gperf" + {"FTP-Arguments", Http::HdrType::FTP_ARGUMENTS, Http::HdrFieldType::ftStr, HdrKind::None}, +#line 96 "RegisteredHeadersHash.gperf" + {"Warning", Http::HdrType::WARNING, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader}, + {""}, {""}, {""}, {""}, +#line 113 "RegisteredHeadersHash.gperf" + {"FTP-Reason", Http::HdrType::FTP_REASON, Http::HdrFieldType::ftStr, HdrKind::None}, + {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, +#line 85 "RegisteredHeadersHash.gperf" + {"Set-Cookie2", Http::HdrType::SET_COOKIE2, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader} + }; const class HeaderTableRecord * - HttpHeaderHashTable::lookup (const char *str, size_t len) +HttpHeaderHashTable::lookup (register const char *str, register unsigned int len) { - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { - unsigned int key = HttpHeaderHash (str, len); + unsigned int key = HttpHeaderHash (str, len); - if (key <= MAX_HASH_VALUE) - if (len == lengthtable[key]) - { - const char *s = HttpHeaderDefinitionsTable[key].name; - - if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_memcmp (str, s, len)) - return &HttpHeaderDefinitionsTable[key]; - } + if (key <= MAX_HASH_VALUE) + if (len == lengthtable[key]) + { + register const char *s = HttpHeaderDefinitionsTable[key].name; + + if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_memcmp (str, s, len)) + return &HttpHeaderDefinitionsTable[key]; + } } - return 0; + return 0; } -#line 115 "RegisteredHeadersHash.gperf" +#line 116 "RegisteredHeadersHash.gperf" diff -Naur a/src/http/RegisteredHeadersHash.gperf b/src/http/RegisteredHeadersHash.gperf --- a/src/http/RegisteredHeadersHash.gperf 2022-06-05 15:11:52.000000000 -0700 +++ b/src/http/RegisteredHeadersHash.gperf 2022-08-11 11:00:16.000000000 -0700 @@ -102,6 +102,7 @@ X-Squid-Error, Http::HdrType::X_SQUID_ERROR, Http::HdrFieldType::ftStr, HdrKind::ReplyHeader X-Accelerator-Vary, Http::HdrType::HDR_X_ACCELERATOR_VARY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader X-Next-Services, Http::HdrType::X_NEXT_SERVICES, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::ReplyHeader +x-ms-range, Http::HdrType::X_MS_RANGE, Http::HdrFieldType::ftPRange, HdrKind::None Surrogate-Capability, Http::HdrType::SURROGATE_CAPABILITY, Http::HdrFieldType::ftStr, HdrKind::ListHeader|HdrKind::RequestHeader Surrogate-Control, Http::HdrType::SURROGATE_CONTROL, Http::HdrFieldType::ftPSc, HdrKind::ListHeader|HdrKind::ReplyHeader Front-End-Https, Http::HdrType::FRONT_END_HTTPS, Http::HdrFieldType::ftStr, HdrKind::None diff -Naur a/src/http/Stream.cc b/src/http/Stream.cc --- a/src/http/Stream.cc 2022-06-05 15:11:52.000000000 -0700 +++ b/src/http/Stream.cc 2022-08-12 16:06:20.000000000 -0700 @@ -82,7 +82,9 @@ switch (socketState()) { case STREAM_NONE: - pullData(); + if (!needsStallUntilEnd()) { + pullData(); + } break; case STREAM_COMPLETE: { @@ -128,6 +130,32 @@ } bool +Http::Stream::needsStallUntilEnd() +{ + const StoreEntry *entry = http->storeEntry(); + /* ignore if we don't have a range or reply or content length or entry */ + if (!http->request->range || !reply || !reply->content_length || !entry) { + return false; + } + + int64_t roffLimit = http->request->getRangeOffsetLimit(); + debugs(33, 5, reply << " has range limit " << roffLimit); + + if (reply->content_length + reply->hdr_sz == entry->objectLen() || + http->request->range->offsetLimitExceeded(roffLimit)) { + debugs(33, 5, reply << " unstalled from sending response"); + return false; + } + + StoreIOBuffer readBuffer; + readBuffer.offset = reply->content_length; + debugs(33, 5, reply << " stalling until we recieved all data"); + clientStreamRead(getTail(), http, readBuffer); + + return true; +} + +bool Http::Stream::multipartRangeRequest() const { return http->multipartRangeRequest(); diff -Naur a/src/http/Stream.h b/src/http/Stream.h --- a/src/http/Stream.h 2022-06-05 15:11:52.000000000 -0700 +++ b/src/http/Stream.h 2022-08-12 12:34:56.000000000 -0700 @@ -90,6 +90,9 @@ /// get more data to send void pullData(); + /// handles when client needs a partial response and we cache the whole thing + bool needsStallUntilEnd(); + /// \return true if the HTTP request is for multiple ranges bool multipartRangeRequest() const; diff -Naur a/src/http.cc b/src/http.cc --- a/src/http.cc 2022-06-05 15:11:52.000000000 -0700 +++ b/src/http.cc 2022-08-11 10:58:53.000000000 -0700 @@ -2251,6 +2251,8 @@ case Http::HdrType::IF_RANGE: case Http::HdrType::REQUEST_RANGE: + + case Http::HdrType::X_MS_RANGE: /** \par Range:, If-Range:, Request-Range: * Only pass if we accept ranges */ if (!we_do_ranges)