proxygen
HTTPCommonHeaders.cpp
Go to the documentation of this file.
1 /* C++ code produced by gperf version 3.0.4 */
2 /* Command-line: gperf -m5 --output-file=./HTTPCommonHeaders.cpp */
3 /* Computed positions: -k'1,8,22,$' */
4 
5 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
6  && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
7  && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
8  && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
9  && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
10  && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
11  && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
12  && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
13  && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
14  && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
15  && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
16  && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
17  && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
18  && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
19  && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
20  && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
21  && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
22  && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
23  && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
24  && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
25  && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
26  && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
27  && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
28 /* The character set is not based on ISO-646. */
29 #error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
30 #endif
31 
32 
33 // Copyright 2015-present Facebook. All rights reserved.
34 
36 
37 #include <cstring>
38 
39 #include <folly/CppAttributes.h>
40 #include <folly/String.h>
41 
42 #include <glog/logging.h>
43 
44 namespace proxygen {
45 
46 struct HTTPCommonHeaderName { const char* name; HTTPHeaderCode code; };
47 
48 
49 
50 
51 
52 /* the following is a placeholder for the build script to generate a list
53  * of enum values from the list in HTTPCommonHeaders.txt
54  */;
55 enum
56  {
62  };
63 
64 /* maximum key range = 129, duplicates = 0 */
65 
66 #ifndef GPERF_DOWNCASE
67 #define GPERF_DOWNCASE 1
68 static unsigned char gperf_downcase[256] =
69  {
70  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
71  15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
72  30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
73  45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
74  60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
75  107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
76  122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
77  105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
78  120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
79  135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
80  150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
81  165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
82  180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
83  195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
84  210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
85  225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
86  240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
87  255
88  };
89 #endif
90 
91 #ifndef GPERF_CASE_MEMCMP
92 #define GPERF_CASE_MEMCMP 1
93 static int
94 gperf_case_memcmp (register const char *s1, register const char *s2, register unsigned int n)
95 {
96  for (; n > 0;)
97  {
98  unsigned char c1 = gperf_downcase[(unsigned char)*s1++];
99  unsigned char c2 = gperf_downcase[(unsigned char)*s2++];
100  if (c1 == c2)
101  {
102  n--;
103  continue;
104  }
105  return (int)c1 - (int)c2;
106  }
107  return 0;
108 }
109 #endif
110 
112 {
113 private:
114  static inline unsigned int hash (const char *str, unsigned int len);
115 public:
116  static const struct HTTPCommonHeaderName *in_word_set (const char *str, unsigned int len);
117 };
118 
119 inline unsigned int
120 HTTPCommonHeadersInternal::hash (register const char *str, register unsigned int len)
121 {
122  static const unsigned char asso_values[] =
123  {
124  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
125  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
126  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
127  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
128  134, 134, 134, 134, 134, 6, 134, 134, 134, 134,
129  134, 134, 134, 6, 134, 134, 134, 134, 44, 134,
130  134, 134, 134, 134, 134, 0, 134, 4, 32, 2,
131  64, 58, 20, 17, 134, 77, 15, 31, 16, 39,
132  51, 134, 8, 0, 2, 45, 59, 38, 10, 55,
133  31, 134, 134, 134, 134, 134, 134, 0, 134, 4,
134  32, 2, 64, 58, 20, 17, 134, 77, 15, 31,
135  16, 39, 51, 134, 8, 0, 2, 45, 59, 38,
136  10, 55, 31, 134, 134, 134, 134, 134, 134, 134,
137  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
138  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
139  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
140  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
141  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
142  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
143  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
144  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
145  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
146  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
147  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
148  134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
149  134, 134, 134, 134, 134, 134
150  };
151  register int hval = len;
152 
153  switch (hval)
154  {
155  default:
156  hval += asso_values[(unsigned char)str[21]];
158  case 21:
159  case 20:
160  case 19:
161  case 18:
162  case 17:
163  case 16:
164  case 15:
165  case 14:
166  case 13:
167  case 12:
168  case 11:
169  case 10:
170  case 9:
171  case 8:
172  hval += asso_values[(unsigned char)str[7]];
174  case 7:
175  case 6:
176  case 5:
177  case 4:
178  case 3:
179  case 2:
180  case 1:
181  hval += asso_values[(unsigned char)str[0]];
182  break;
183  }
184  return hval + asso_values[(unsigned char)str[len - 1]];
185 }
186 
187 static const unsigned char lengthtable[] =
188  {
189  0, 0, 0, 0, 0, 3, 2, 0, 6, 7, 6, 7, 6, 0,
190  6, 5, 0, 7, 0, 0, 14, 13, 20, 7, 12, 13, 4, 11,
191  16, 8, 22, 15, 15, 13, 16, 7, 30, 3, 4, 29, 32, 15,
192  16, 5, 14, 19, 16, 10, 22, 15, 16, 7, 28, 7, 7, 8,
193  13, 6, 15, 10, 13, 6, 3, 28, 4, 8, 0, 29, 0, 5,
194  19, 13, 17, 0, 17, 15, 16, 17, 0, 12, 0, 12, 0, 7,
195  16, 17, 27, 9, 0, 10, 25, 11, 13, 9, 0, 15, 4, 0,
196  0, 4, 17, 0, 0, 7, 0, 3, 10, 9, 0, 0, 0, 0,
197  0, 3, 0, 0, 18, 0, 4, 0, 0, 0, 16, 0, 0, 0,
198  10, 0, 0, 0, 0, 19, 0, 37
199  };
200 
201 static const struct HTTPCommonHeaderName wordlist[] =
202  {
203  {""}, {""}, {""}, {""}, {""},
204  {"Age", HTTP_HEADER_AGE},
205  {"TE", HTTP_HEADER_TE},
206  {""},
207  {"Accept", HTTP_HEADER_ACCEPT},
208  {"Expires", HTTP_HEADER_EXPIRES},
209  {"Expect", HTTP_HEADER_EXPECT},
210  {"Alt-Svc", HTTP_HEADER_ALT_SVC},
211  {"Cookie", HTTP_HEADER_COOKIE},
212  {""},
213  {"Server", HTTP_HEADER_SERVER},
214  {"Range", HTTP_HEADER_RANGE},
215  {""},
216  {"Trailer", HTTP_HEADER_TRAILER},
217  {""}, {""},
218  {"Accept-Charset", HTTP_HEADER_ACCEPT_CHARSET},
219  {"Accept-Ranges", HTTP_HEADER_ACCEPT_RANGES},
220  {"Sec-WebSocket-Accept", HTTP_HEADER_SEC_WEBSOCKET_ACCEPT},
221  {"Referer", HTTP_HEADER_REFERER},
222  {"Content-Type", HTTP_HEADER_CONTENT_TYPE},
223  {"Content-Range", HTTP_HEADER_CONTENT_RANGE},
224  {"Host", HTTP_HEADER_HOST},
225  {"Content-MD5", HTTP_HEADER_CONTENT_MD5},
226  {"Content-Language", HTTP_HEADER_CONTENT_LANGUAGE},
227  {"If-Range", HTTP_HEADER_IF_RANGE},
228  {"Access-Control-Max-Age", HTTP_HEADER_ACCESS_CONTROL_MAX_AGE},
229  {"X-Frame-Options", HTTP_HEADER_X_FRAME_OPTIONS},
230  {"Accept-Language", HTTP_HEADER_ACCEPT_LANGUAGE},
231  {"X-Wap-Profile", HTTP_HEADER_X_WAP_PROFILE},
232  {"X-Accel-Redirect", HTTP_HEADER_X_ACCEL_REDIRECT},
233  {"Refresh", HTTP_HEADER_REFRESH},
234  {"Access-Control-Request-Headers", HTTP_HEADER_ACCESS_CONTROL_REQUEST_HEADERS},
235  {"DNT", HTTP_HEADER_DNT},
236  {"Date", HTTP_HEADER_DATE},
237  {"Access-Control-Expose-Headers", HTTP_HEADER_ACCESS_CONTROL_EXPOSE_HEADERS},
238  {"Access-Control-Allow-Credentials", HTTP_HEADER_ACCESS_CONTROL_ALLOW_CREDENTIALS},
239  {"X-Forwarded-For", HTTP_HEADER_X_FORWARDED_FOR},
240  {"Content-Location", HTTP_HEADER_CONTENT_LOCATION},
241  {"Allow", HTTP_HEADER_ALLOW},
242  {"Content-Length", HTTP_HEADER_CONTENT_LENGTH},
243  {"Content-Disposition", HTTP_HEADER_CONTENT_DISPOSITION},
244  {"X-Requested-With", HTTP_HEADER_X_REQUESTED_WITH},
245  {"Connection", HTTP_HEADER_CONNECTION},
246  {"X-Content-Type-Options", HTTP_HEADER_X_CONTENT_TYPE_OPTIONS},
247  {"Accept-Datetime", HTTP_HEADER_ACCEPT_DATETIME},
248  {"X-XSS-Protection", HTTP_HEADER_X_XSS_PROTECTION},
249  {":Status", HTTP_HEADER_COLON_STATUS},
250  {"Access-Control-Allow-Headers", HTTP_HEADER_ACCESS_CONTROL_ALLOW_HEADERS},
251  {":Scheme", HTTP_HEADER_COLON_SCHEME},
252  {"Upgrade", HTTP_HEADER_UPGRADE},
253  {"Location", HTTP_HEADER_LOCATION},
254  {"If-None-Match", HTTP_HEADER_IF_NONE_MATCH},
255  {"Pragma", HTTP_HEADER_PRAGMA},
256  {"X-UA-Compatible", HTTP_HEADER_X_UA_COMPATIBLE},
257  {"User-Agent", HTTP_HEADER_USER_AGENT},
258  {"Authorization", HTTP_HEADER_AUTHORIZATION},
259  {"Origin", HTTP_HEADER_ORIGIN},
260  {"Via", HTTP_HEADER_VIA},
261  {"Access-Control-Allow-Methods", HTTP_HEADER_ACCESS_CONTROL_ALLOW_METHODS},
262  {"ETag", HTTP_HEADER_ETAG},
263  {"If-Match", HTTP_HEADER_IF_MATCH},
264  {""},
265  {"Access-Control-Request-Method", HTTP_HEADER_ACCESS_CONTROL_REQUEST_METHOD},
266  {""},
267  {":Path", HTTP_HEADER_COLON_PATH},
268  {"If-Unmodified-Since", HTTP_HEADER_IF_UNMODIFIED_SINCE},
269  {"Cache-Control", HTTP_HEADER_CACHE_CONTROL},
270  {"Sec-WebSocket-Key", HTTP_HEADER_SEC_WEBSOCKET_KEY},
271  {""},
272  {"X-Forwarded-Proto", HTTP_HEADER_X_FORWARDED_PROTO},
273  {"Accept-Encoding", HTTP_HEADER_ACCEPT_ENCODING},
274  {"WWW-Authenticate", HTTP_HEADER_WWW_AUTHENTICATE},
275  {"Sec-Token-Binding", HTTP_HEADER_SEC_TOKEN_BINDING},
276  {""},
277  {"X-Powered-By", HTTP_HEADER_X_POWERED_BY},
278  {""},
279  {"Max-Forwards", HTTP_HEADER_MAX_FORWARDS},
280  {""},
281  {":Method", HTTP_HEADER_COLON_METHOD},
282  {"Content-Encoding", HTTP_HEADER_CONTENT_ENCODING},
283  {"Transfer-Encoding", HTTP_HEADER_TRANSFER_ENCODING},
284  {"Access-Control-Allow-Origin", HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN},
285  {"X-Real-IP", HTTP_HEADER_X_REAL_IP},
286  {""},
287  {"Set-Cookie", HTTP_HEADER_SET_COOKIE},
288  {"Strict-Transport-Security", HTTP_HEADER_STRICT_TRANSPORT_SECURITY},
289  {"Retry-After", HTTP_HEADER_RETRY_AFTER},
290  {"Last-Modified", HTTP_HEADER_LAST_MODIFIED},
291  {"Timestamp", HTTP_HEADER_TIMESTAMP},
292  {""},
293  {"Front-End-Https", HTTP_HEADER_FRONT_END_HTTPS},
294  {"Link", HTTP_HEADER_LINK},
295  {""}, {""},
296  {"From", HTTP_HEADER_FROM},
297  {"If-Modified-Since", HTTP_HEADER_IF_MODIFIED_SINCE},
298  {""}, {""},
299  {"Warning", HTTP_HEADER_WARNING},
300  {""},
301  {"P3P", HTTP_HEADER_P3P},
302  {"Keep-Alive", HTTP_HEADER_KEEP_ALIVE},
303  {":Protocol", HTTP_HEADER_COLON_PROTOCOL},
304  {""}, {""}, {""}, {""}, {""},
305  {"VIP", HTTP_HEADER_VIP},
306  {""}, {""},
307  {"Proxy-Authenticate", HTTP_HEADER_PROXY_AUTHENTICATE},
308  {""},
309  {"Vary", HTTP_HEADER_VARY},
310  {""}, {""}, {""},
311  {"Proxy-Connection", HTTP_HEADER_PROXY_CONNECTION},
312  {""}, {""}, {""},
313  {":Authority", HTTP_HEADER_COLON_AUTHORITY},
314  {""}, {""}, {""}, {""},
315  {"Proxy-Authorization", HTTP_HEADER_PROXY_AUTHORIZATION},
316  {""},
317  {"X-Content-Security-Policy-Report-Only", HTTP_HEADER_X_CONTENT_SECURITY_POLICY_REPORT_ONLY}
318  };
319 
320 const struct HTTPCommonHeaderName *
321 HTTPCommonHeadersInternal::in_word_set (register const char *str, register unsigned int len)
322 {
323  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
324  {
325  register int key = hash (str, len);
326 
327  if (key <= MAX_HASH_VALUE && key >= 0)
328  if (len == lengthtable[key])
329  {
330  register const char *s = wordlist[key].name;
331 
332  if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_memcmp (str, s, len))
333  return &wordlist[key];
334  }
335  }
336  return 0;
337 }
338 
339 
340 
341 
342 
343 HTTPHeaderCode HTTPCommonHeaders::hash(const char* name, size_t len) {
344  const HTTPCommonHeaderName* match =
346  return (match == nullptr) ? HTTP_HEADER_OTHER : match->code;
347 }
348 
351  auto headerNames = new std::string[HTTPCommonHeaders::num_header_codes];
352  for (int j = MIN_HASH_VALUE; j <= MAX_HASH_VALUE; ++j) {
353  uint8_t code = wordlist[j].code;
354  const uint8_t OFFSET = 2; // first 2 values are reserved for special cases
355  if (code >= OFFSET && code < TOTAL_KEYWORDS + OFFSET
356  && wordlist[j].name[0] != '\0') {
357  DCHECK_EQ(headerNames[code], std::string());
358  // this would mean a duplicate header code in the .gperf file
359  headerNames[code] = wordlist[j].name;
360  if (type == TABLE_LOWERCASE) {
361  folly::toLowerAscii(const_cast<char*>(headerNames[code].data()),
362  headerNames[code].size());
363  }
364  }
365  }
366  return headerNames;
367 }
368 
371  // The actual common header tables are static and initialized here in source
372  // so as to prevent duplicate initializations that could occur through the
373  // use of inline semantics or compilation unit referencing if defined in a
374  // header
375  switch(type) {
376  case TABLE_CAMELCASE:
377  static const std::string* camelcaseTable = initHeaderNames(type);
378  return camelcaseTable;
379  case TABLE_LOWERCASE:
380  static const std::string* lowercaseTable = initHeaderNames(type);
381  return lowercaseTable;
382  default:
383  // Controlled abort here so its clear from a crash stack this method
384  // was called with a table type for which there is no current
385  // implementation
386  CHECK(false);
387  return nullptr;
388  }
389 }
390 
391 } // proxygen
static unsigned int hash(const char *str, unsigned int len)
static FB_EXPORT std::string * initHeaderNames(HTTPCommonHeaderTableType type)
PskType type
constexpr auto size(C const &c) -> decltype(c.size())
Definition: Access.h:45
static const struct HTTPCommonHeaderName wordlist[]
void toLowerAscii(char *str, size_t length)
Definition: String.cpp:601
static constexpr uint64_t num_header_codes
const char * string
Definition: Conv.cpp:212
static const std::string * getPointerToCommonHeaderTable(HTTPCommonHeaderTableType type)
static set< string > s
static const unsigned char lengthtable[]
static int gperf_case_memcmp(register const char *s1, register const char *s2, register unsigned int n)
static FB_EXPORT HTTPHeaderCode hash(const char *name, size_t len)
static unsigned char gperf_downcase[256]
static const struct HTTPCommonHeaderName * in_word_set(const char *str, unsigned int len)
static constexpr uint64_t data[1]
Definition: Fingerprint.cpp:43
#define FOLLY_FALLTHROUGH
Definition: CppAttributes.h:63