]> git.ipfire.org Git - thirdparty/squid.git/blob - src/http/RegisteredHeaders.cc
Tighten and rationalize checks on HTTP headers' validity.
[thirdparty/squid.git] / src / http / RegisteredHeaders.cc
1 /*
2 * Copyright (C) 1996-2015 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
14 namespace Http
15 {
16 /*
17 * A table with major attributes for every known field.
18 *
19 * Invariant on this table:
20 * for each index in HeaderTable, (int)HeaderTable[index] = index
21 *
22 * To be kept in sync with Http::HdrType
23 */
24 const HeaderTableRecord HeaderTable[] = {
25 {"Accept", Http::HdrType::ACCEPT, Http::HdrFieldType::ftStr},
26 {"Accept-Charset", Http::HdrType::ACCEPT_CHARSET, Http::HdrFieldType::ftStr},
27 {"Accept-Encoding", Http::HdrType::ACCEPT_ENCODING, Http::HdrFieldType::ftStr},
28 {"Accept-Language", Http::HdrType::ACCEPT_LANGUAGE, Http::HdrFieldType::ftStr},
29 {"Accept-Ranges", Http::HdrType::ACCEPT_RANGES, Http::HdrFieldType::ftStr},
30 {"Age", Http::HdrType::AGE, Http::HdrFieldType::ftInt},
31 {"Allow", Http::HdrType::ALLOW, Http::HdrFieldType::ftStr},
32 {"Alternate-Protocol", Http::HdrType::ALTERNATE_PROTOCOL, Http::HdrFieldType::ftStr},
33 {"Authentication-Info", Http::HdrType::AUTHENTICATION_INFO, Http::HdrFieldType::ftStr},
34 {"Authorization", Http::HdrType::AUTHORIZATION, Http::HdrFieldType::ftStr}, /* for now */
35 {"Cache-Control", Http::HdrType::CACHE_CONTROL, Http::HdrFieldType::ftPCc},
36 {"Connection", Http::HdrType::CONNECTION, Http::HdrFieldType::ftStr},
37 {"Content-Base", Http::HdrType::CONTENT_BASE, Http::HdrFieldType::ftStr},
38 {"Content-Disposition", Http::HdrType::CONTENT_DISPOSITION, Http::HdrFieldType::ftStr}, /* for now */
39 {"Content-Encoding", Http::HdrType::CONTENT_ENCODING, Http::HdrFieldType::ftStr},
40 {"Content-Language", Http::HdrType::CONTENT_LANGUAGE, Http::HdrFieldType::ftStr},
41 {"Content-Length", Http::HdrType::CONTENT_LENGTH, Http::HdrFieldType::ftInt64},
42 {"Content-Location", Http::HdrType::CONTENT_LOCATION, Http::HdrFieldType::ftStr},
43 {"Content-MD5", Http::HdrType::CONTENT_MD5, Http::HdrFieldType::ftStr}, /* for now */
44 {"Content-Range", Http::HdrType::CONTENT_RANGE, Http::HdrFieldType::ftPContRange},
45 {"Content-Type", Http::HdrType::CONTENT_TYPE, Http::HdrFieldType::ftStr},
46 {"Cookie", Http::HdrType::COOKIE, Http::HdrFieldType::ftStr},
47 {"Cookie2", Http::HdrType::COOKIE2, Http::HdrFieldType::ftStr},
48 {"Date", Http::HdrType::DATE, Http::HdrFieldType::ftDate_1123},
49 {"ETag", Http::HdrType::ETAG, Http::HdrFieldType::ftETag},
50 {"Expect", Http::HdrType::EXPECT, Http::HdrFieldType::ftStr},
51 {"Expires", Http::HdrType::EXPIRES, Http::HdrFieldType::ftDate_1123},
52 {"Forwarded", Http::HdrType::FORWARDED, Http::HdrFieldType::ftStr},
53 {"From", Http::HdrType::FROM, Http::HdrFieldType::ftStr},
54 {"Host", Http::HdrType::HOST, Http::HdrFieldType::ftStr},
55 {"HTTP2-Settings", Http::HdrType::HTTP2_SETTINGS, Http::HdrFieldType::ftStr}, /* for now */
56 {"If-Match", Http::HdrType::IF_MATCH, Http::HdrFieldType::ftStr}, /* for now */
57 {"If-Modified-Since", Http::HdrType::IF_MODIFIED_SINCE, Http::HdrFieldType::ftDate_1123},
58 {"If-None-Match", Http::HdrType::IF_NONE_MATCH, Http::HdrFieldType::ftStr}, /* for now */
59 {"If-Range", Http::HdrType::IF_RANGE, Http::HdrFieldType::ftDate_1123_or_ETag},
60 {"If-Unmodified-Since", Http::HdrType::IF_UNMODIFIED_SINCE, Http::HdrFieldType::ftDate_1123},
61 {"Keep-Alive", Http::HdrType::KEEP_ALIVE, Http::HdrFieldType::ftStr},
62 {"Key", Http::HdrType::KEY, Http::HdrFieldType::ftStr},
63 {"Last-Modified", Http::HdrType::LAST_MODIFIED, Http::HdrFieldType::ftDate_1123},
64 {"Link", Http::HdrType::LINK, Http::HdrFieldType::ftStr},
65 {"Location", Http::HdrType::LOCATION, Http::HdrFieldType::ftStr},
66 {"Max-Forwards", Http::HdrType::MAX_FORWARDS, Http::HdrFieldType::ftInt64},
67 {"Mime-Version", Http::HdrType::MIME_VERSION, Http::HdrFieldType::ftStr}, /* for now */
68 {"Negotiate", Http::HdrType::NEGOTIATE, Http::HdrFieldType::ftStr},
69 {"Origin", Http::HdrType::ORIGIN, Http::HdrFieldType::ftStr},
70 {"Pragma", Http::HdrType::PRAGMA, Http::HdrFieldType::ftStr},
71 {"Proxy-Authenticate", Http::HdrType::PROXY_AUTHENTICATE, Http::HdrFieldType::ftStr},
72 {"Proxy-Authentication-Info", Http::HdrType::PROXY_AUTHENTICATION_INFO, Http::HdrFieldType::ftStr},
73 {"Proxy-Authorization", Http::HdrType::PROXY_AUTHORIZATION, Http::HdrFieldType::ftStr},
74 {"Proxy-Connection", Http::HdrType::PROXY_CONNECTION, Http::HdrFieldType::ftStr},
75 {"Proxy-support", Http::HdrType::PROXY_SUPPORT, Http::HdrFieldType::ftStr},
76 {"Public", Http::HdrType::PUBLIC, Http::HdrFieldType::ftStr},
77 {"Range", Http::HdrType::RANGE, Http::HdrFieldType::ftPRange},
78 {"Referer", Http::HdrType::REFERER, Http::HdrFieldType::ftStr},
79 {"Request-Range", Http::HdrType::REQUEST_RANGE, Http::HdrFieldType::ftPRange}, /* usually matches Http::HdrType::RANGE */
80 {"Retry-AHttp::HdrFieldType::fter", Http::HdrType::RETRY_AFTER, Http::HdrFieldType::ftStr}, /* for now (Http::HdrFieldType::ftDate_1123 or Http::HdrFieldType::ftInt!} */
81 {"Server", Http::HdrType::SERVER, Http::HdrFieldType::ftStr},
82 {"Set-Cookie", Http::HdrType::SET_COOKIE, Http::HdrFieldType::ftStr},
83 {"Set-Cookie2", Http::HdrType::SET_COOKIE2, Http::HdrFieldType::ftStr},
84 {"TE", Http::HdrType::TE, Http::HdrFieldType::ftStr},
85 {"Title", Http::HdrType::TITLE, Http::HdrFieldType::ftStr},
86 {"Trailer", Http::HdrType::TRAILER, Http::HdrFieldType::ftStr},
87 {"Transfer-Encoding", Http::HdrType::TRANSFER_ENCODING, Http::HdrFieldType::ftStr},
88 {"Translate", Http::HdrType::TRANSLATE, Http::HdrFieldType::ftStr}, /* for now. may need to crop */
89 {"Unless-Modified-Since", Http::HdrType::UNLESS_MODIFIED_SINCE, Http::HdrFieldType::ftStr}, /* for now ignore. may need to crop */
90 {"Upgrade", Http::HdrType::UPGRADE, Http::HdrFieldType::ftStr}, /* for now */
91 {"User-Agent", Http::HdrType::USER_AGENT, Http::HdrFieldType::ftStr},
92 {"Vary", Http::HdrType::VARY, Http::HdrFieldType::ftStr}, /* for now */
93 {"Via", Http::HdrType::VIA, Http::HdrFieldType::ftStr}, /* for now */
94 {"Warning", Http::HdrType::WARNING, Http::HdrFieldType::ftStr}, /* for now */
95 {"WWW-Authenticate", Http::HdrType::WWW_AUTHENTICATE, Http::HdrFieldType::ftStr},
96 {"X-Cache", Http::HdrType::X_CACHE, Http::HdrFieldType::ftStr},
97 {"X-Cache-Lookup", Http::HdrType::X_CACHE_LOOKUP, Http::HdrFieldType::ftStr},
98 {"X-Forwarded-For", Http::HdrType::X_FORWARDED_FOR, Http::HdrFieldType::ftStr},
99 {"X-Request-URI", Http::HdrType::X_REQUEST_URI, Http::HdrFieldType::ftStr},
100 {"X-Squid-Error", Http::HdrType::X_SQUID_ERROR, Http::HdrFieldType::ftStr},
101 #if X_ACCELERATOR_VARY
102 {"X-Accelerator-Vary", Http::HdrType::HDR_X_ACCELERATOR_VARY, Http::HdrFieldType::ftStr},
103 #endif
104 #if USE_ADAPTATION
105 {"X-Next-Services", Http::HdrType::X_NEXT_SERVICES, Http::HdrFieldType::ftStr},
106 #endif
107 {"Surrogate-Capability", Http::HdrType::SURROGATE_CAPABILITY, Http::HdrFieldType::ftStr},
108 {"Surrogate-Control", Http::HdrType::SURROGATE_CONTROL, Http::HdrFieldType::ftPSc},
109 {"Front-End-Https", Http::HdrType::FRONT_END_HTTPS, Http::HdrFieldType::ftStr},
110 {"FTP-Command", Http::HdrType::FTP_COMMAND, Http::HdrFieldType::ftStr},
111 {"FTP-Arguments", Http::HdrType::FTP_ARGUMENTS, Http::HdrFieldType::ftStr},
112 {"FTP-Pre", Http::HdrType::FTP_PRE, Http::HdrFieldType::ftStr},
113 {"FTP-Status", Http::HdrType::FTP_STATUS, Http::HdrFieldType::ftInt},
114 {"FTP-Reason", Http::HdrType::FTP_REASON, Http::HdrFieldType::ftStr},
115 {"Other:", Http::HdrType::OTHER, Http::HdrFieldType::ftStr}, /* ':' will not allow matches */
116 {"*INVALID*:", Http::HdrType::BAD_HDR, Http::HdrFieldType::ftInvalid}, /* ':' will not allow matches */
117 {nullptr, Http::HdrType::ENUM_END, Http::HdrFieldType::ftInvalid} /* end of table */
118 };
119
120 const LookupTable<Http::HdrType, HeaderTableRecord> HeaderLookupTable(Http::HdrType::BAD_HDR, HeaderTable);
121
122 }; /* namespace Http */
123