]> git.ipfire.org Git - thirdparty/squid.git/blob - src/http/RegisteredHeaders.cc
d1aacb1aa1cfd7d08b715cffe2ecc375f9e418b4
[thirdparty/squid.git] / src / http / RegisteredHeaders.cc
1 /*
2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9 #include "squid.h"
10 #include "RegisteredHeaders.h"
11
12 #include <ostream>
13 #include <vector>
14
15 namespace Http
16 {
17 /* glue to code generated by gperf */
18 #include "http/RegisteredHeadersHash.cci"
19
20 HeaderTableRecord::HeaderTableRecord(const char *n) :
21 name(n)
22 {}
23
24 HeaderTableRecord::HeaderTableRecord(const char *n, HdrType theId, HdrFieldType theType, int theKind) :
25 name(n), id(theId), type(theType),
26 list(theKind & HdrKind::ListHeader), request(theKind & HdrKind::RequestHeader),
27 reply(theKind & HdrKind::ReplyHeader), hopbyhop(theKind & HdrKind::HopByHopHeader),
28 denied304(theKind & HdrKind::Denied304Header)
29 {}
30
31 const HeaderTableRecord&
32 HeaderLookupTable_t::lookup (const char *buf, const std::size_t len) const {
33 const HeaderTableRecord *r = HttpHeaderHashTable::lookup(buf, len);
34 if (!r || r->id == Http::HdrType::OTHER)
35 return BadHdr;
36 return *r;
37 }
38 const HeaderTableRecord HeaderLookupTable_t::BadHdr {"*INVALID*:", Http::HdrType::BAD_HDR, Http::HdrFieldType::ftInvalid, HdrKind::None};
39
40 HeaderLookupTable_t::HeaderLookupTable_t()
41 {
42 initCache();
43 }
44
45 void
46 HeaderLookupTable_t::initCache()
47 {
48 idCache.resize(TOTAL_KEYWORDS);
49 for (int j = MIN_HASH_VALUE; j <= MAX_HASH_VALUE; ++j) { //MAX_HASH_VALUE is exported by gperf
50 if (HttpHeaderDefinitionsTable[j].name[0] != '\0') { //some slots are empty
51 idCache[static_cast<int>(HttpHeaderDefinitionsTable[j].id)] =
52 & HttpHeaderDefinitionsTable[j];
53 }
54 }
55 //check after the fact. The cache array must be full
56 for (auto e : idCache) {
57 assert(e->name);
58 }
59 }
60 const HeaderLookupTable_t HeaderLookupTable;
61
62 }; /* namespace Http */
63
64 std::ostream&
65 Http::operator<< (std::ostream &s, const HdrType id)
66 {
67 if (any_HdrType_enum_value(id))
68 s << HeaderLookupTable.lookup(id).name << '[' << static_cast<int>(id) << ']';
69 else
70 s << "Invalid-Header[" << static_cast<int>(id) << ']';
71 return s;
72 }
73