]> git.ipfire.org Git - thirdparty/squid.git/blob - src/HttpHeader.h
Docs: update HTTP header registrations
[thirdparty/squid.git] / src / HttpHeader.h
1 /*
2 *
3 * SQUID Web Proxy Cache http://www.squid-cache.org/
4 * ----------------------------------------------------------
5 *
6 * Squid is the result of efforts by numerous individuals from
7 * the Internet community; see the CONTRIBUTORS file for full
8 * details. Many organizations have provided support for Squid's
9 * development; see the SPONSORS file for full details. Squid is
10 * Copyrighted (C) 2001 by the Regents of the University of
11 * California; see the COPYRIGHT file for full details. Squid
12 * incorporates software developed and/or copyrighted by other
13 * sources; see the CREDITS file for full details.
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
28 *
29 */
30
31 #ifndef SQUID_HTTPHEADER_H
32 #define SQUID_HTTPHEADER_H
33
34 /* because we pass a spec by value */
35 #include "HttpHeaderMask.h"
36 #include "MemPool.h"
37 #include "SquidString.h"
38
39 #include <vector>
40
41 /* class forward declarations */
42 class HttpHdrCc;
43 class HttpHdrContRange;
44 class HttpHdrRange;
45 class HttpHdrSc;
46 class Packer;
47 class StoreEntry;
48
49 /* constant attributes of http header fields */
50
51 /// recognized or "known" header fields; and the RFC which defines them (or not)
52 /// http://www.iana.org/assignments/message-headers/message-headers.xhtml
53 typedef enum {
54 HDR_BAD_HDR = -1,
55 HDR_ACCEPT = 0, /**< RFC 7231 */
56 HDR_ACCEPT_CHARSET, /**< RFC 7231 */
57 HDR_ACCEPT_ENCODING, /**< RFC 7231 */
58 /*HDR_ACCEPT_FEATURES,*/ /* RFC 2295 */
59 HDR_ACCEPT_LANGUAGE, /**< RFC 7231 */
60 HDR_ACCEPT_RANGES, /**< RFC 7233 */
61 HDR_AGE, /**< RFC 7234 */
62 HDR_ALLOW, /**< RFC 7231 */
63 HDR_AUTHENTICATION_INFO, /**< RFC 2617 */
64 HDR_AUTHORIZATION, /**< RFC 7235, 4559 */
65 HDR_CACHE_CONTROL, /**< RFC 7234 */
66 HDR_CONNECTION, /**< RFC 7230 */
67 HDR_CONTENT_BASE, /**< obsoleted RFC 2068 */
68 HDR_CONTENT_DISPOSITION, /**< RFC 2183, 6266 */
69 HDR_CONTENT_ENCODING, /**< RFC 7231 */
70 HDR_CONTENT_LANGUAGE, /**< RFC 7231 */
71 HDR_CONTENT_LENGTH, /**< RFC 7230 */
72 HDR_CONTENT_LOCATION, /**< RFC 7231 */
73 HDR_CONTENT_MD5, /**< deprecated, RFC 2616 */
74 HDR_CONTENT_RANGE, /**< RFC 7233 */
75 HDR_CONTENT_TYPE, /**< RFC 7231 */
76 HDR_COOKIE, /**< RFC 6265 header we may need to erase */
77 HDR_COOKIE2, /**< obsolete RFC 2965 header we may need to erase */
78 HDR_DATE, /**< RFC 7231 */
79 /*HDR_DAV,*/ /* RFC 2518 */
80 /*HDR_DEPTH,*/ /* RFC 2518 */
81 /*HDR_DERIVED_FROM,*/ /* deprecated RFC 2068 */
82 /*HDR_DESTINATION,*/ /* RFC 2518 */
83 HDR_ETAG, /**< RFC 7232 */
84 HDR_EXPECT, /**< RFC 7231 */
85 HDR_EXPIRES, /**< RFC 7234 */
86 HDR_FORWARDED, /**< RFC 7239 */
87 HDR_FROM, /**< RFC 7231 */
88 HDR_HOST, /**< RFC 7230 */
89 HDR_HTTP2_SETTINGS, /**< HTTP/2.0 upgrade header. see draft-ietf-httpbis-http2-13 */
90 /*HDR_IF,*/ /* RFC 2518 */
91 HDR_IF_MATCH, /**< RFC 7232 */
92 HDR_IF_MODIFIED_SINCE, /**< RFC 7232 */
93 HDR_IF_NONE_MATCH, /**< RFC 7232 */
94 HDR_IF_RANGE, /**< RFC 7233 */
95 HDR_IF_UNMODIFIED_SINCE, /**< RFC 7232 */
96 HDR_KEEP_ALIVE, /**< obsoleted RFC 2068 header we may need to erase */
97 HDR_KEY, /**< experimental RFC Draft draft-fielding-http-key-02 */
98 HDR_LAST_MODIFIED, /**< RFC 7232 */
99 HDR_LINK, /**< RFC 5988 */
100 HDR_LOCATION, /**< RFC 7231 */
101 /*HDR_LOCK_TOKEN,*/ /* RFC 2518 */
102 HDR_MAX_FORWARDS, /**< RFC 7231 */
103 HDR_MIME_VERSION, /**< RFC 2045, 7231 */
104 HDR_NEGOTIATE, /**< experimental RFC 2295. Why only this one from 2295? */
105 /*HDR_OVERWRITE,*/ /* RFC 2518 */
106 HDR_ORIGIN, /* CORS Draft specification (see http://www.w3.org/TR/cors/) */
107 HDR_PRAGMA, /**< RFC 7234 */
108 HDR_PROXY_AUTHENTICATE, /**< RFC 7235 */
109 HDR_PROXY_AUTHENTICATION_INFO, /**< RFC 2617 */
110 HDR_PROXY_AUTHORIZATION, /**< RFC 7235 */
111 HDR_PROXY_CONNECTION, /**< obsolete Netscape header we may need to erase. */
112 HDR_PROXY_SUPPORT, /**< RFC 4559 */
113 HDR_PUBLIC, /**< RFC 2068 */
114 HDR_RANGE, /**< RFC 7233 */
115 HDR_REFERER, /**< RFC 7231 */
116 HDR_REQUEST_RANGE, /**< some clients use this, sigh */
117 HDR_RETRY_AFTER, /**< RFC 7231 */
118 HDR_SERVER, /**< RFC 7231 */
119 HDR_SET_COOKIE, /**< RFC 6265 header we may need to erase */
120 HDR_SET_COOKIE2, /**< obsoleted RFC 2965 header we may need to erase */
121 /*HDR_STATUS_URI,*/ /* RFC 2518 */
122 /*HDR_TCN,*/ /* experimental RFC 2295 */
123 HDR_TE, /**< RFC 7230 */
124 /*HDR_TIMEOUT,*/ /* RFC 2518 */
125 HDR_TITLE, /* obsolete draft suggested header */
126 HDR_TRAILER, /**< RFC 7230 */
127 HDR_TRANSFER_ENCODING, /**< RFC 7230 */
128 HDR_TRANSLATE, /**< IIS custom header we may need to erase */
129 HDR_UNLESS_MODIFIED_SINCE, /**< IIS custom header we may need to erase */
130 HDR_UPGRADE, /**< RFC 7230 */
131 HDR_USER_AGENT, /**< RFC 7231 */
132 /*HDR_VARIANT_VARY,*/ /* experimental RFC 2295 */
133 HDR_VARY, /**< RFC 7231 */
134 HDR_VIA, /**< RFC 7230 */
135 HDR_WARNING, /**< RFC 7234 */
136 HDR_WWW_AUTHENTICATE, /**< RFC 7235, 4559 */
137 HDR_X_CACHE, /**< Squid custom header */
138 HDR_X_CACHE_LOOKUP, /**< Squid custom header. temporary hack that became de-facto. TODO remove */
139 HDR_X_FORWARDED_FOR, /**< obsolete Squid custom header, RFC 7239 */
140 HDR_X_REQUEST_URI, /**< Squid custom header appended if ADD_X_REQUEST_URI is defined */
141 HDR_X_SQUID_ERROR, /**< Squid custom header on generated error responses */
142 #if X_ACCELERATOR_VARY
143 HDR_X_ACCELERATOR_VARY, /**< obsolete Squid custom header. */
144 #endif
145 #if USE_ADAPTATION
146 HDR_X_NEXT_SERVICES, /**< Squid custom ICAP header */
147 #endif
148 HDR_SURROGATE_CAPABILITY, /**< Edge Side Includes (ESI) header */
149 HDR_SURROGATE_CONTROL, /**< Edge Side Includes (ESI) header */
150 HDR_FRONT_END_HTTPS, /**< MS Exchange custom header we may have to add */
151 HDR_OTHER, /**< internal tag value for "unknown" headers */
152 HDR_ENUM_END
153 } http_hdr_type;
154
155 /** possible types for http header fields */
156 typedef enum {
157 ftInvalid = HDR_ENUM_END, /**< to catch nasty errors with hdr_id<->fld_type clashes */
158 ftInt,
159 ftInt64,
160 ftStr,
161 ftDate_1123,
162 ftETag,
163 ftPCc,
164 ftPContRange,
165 ftPRange,
166 ftPSc,
167 ftDate_1123_or_ETag
168 } field_type;
169
170 /** Possible owners of http header */
171 typedef enum {
172 hoNone =0,
173 #if USE_HTCP
174 hoHtcpReply,
175 #endif
176 hoRequest,
177 hoReply,
178 #if USE_OPENSSL
179 hoErrorDetail,
180 #endif
181 hoEnd
182 } http_hdr_owner_type;
183
184 // currently a POD
185 class HttpHeaderFieldAttrs
186 {
187 public:
188 const char *name;
189 http_hdr_type id;
190 field_type type;
191 };
192
193 /** Iteration for headers; use HttpHeaderPos as opaque type, do not interpret */
194 typedef ssize_t HttpHeaderPos;
195
196 /* use this and only this to initialize HttpHeaderPos */
197 #define HttpHeaderInitPos (-1)
198
199 class HttpHeaderEntry
200 {
201
202 public:
203 HttpHeaderEntry(http_hdr_type id, const char *name, const char *value);
204 ~HttpHeaderEntry();
205 static HttpHeaderEntry *parse(const char *field_start, const char *field_end);
206 HttpHeaderEntry *clone() const;
207 void packInto(Packer *p) const;
208 int getInt() const;
209 int64_t getInt64() const;
210 MEMPROXY_CLASS(HttpHeaderEntry);
211 http_hdr_type id;
212 String name;
213 String value;
214 };
215
216 MEMPROXY_CLASS_INLINE(HttpHeaderEntry);
217
218 class ETag;
219 class TimeOrTag;
220
221 class HttpHeader
222 {
223
224 public:
225 HttpHeader();
226 explicit HttpHeader(const http_hdr_owner_type owner);
227 HttpHeader(const HttpHeader &other);
228 ~HttpHeader();
229
230 HttpHeader &operator =(const HttpHeader &other);
231
232 /* Interface functions */
233 void clean();
234 void append(const HttpHeader * src);
235 void update (HttpHeader const *fresh, HttpHeaderMask const *denied_mask);
236 void compact();
237 int reset();
238 int parse(const char *header_start, const char *header_end);
239 void packInto(Packer * p, bool mask_sensitive_info=false) const;
240 HttpHeaderEntry *getEntry(HttpHeaderPos * pos) const;
241 HttpHeaderEntry *findEntry(http_hdr_type id) const;
242 int delByName(const char *name);
243 int delById(http_hdr_type id);
244 void delAt(HttpHeaderPos pos, int &headers_deleted);
245 void refreshMask();
246 void addEntry(HttpHeaderEntry * e);
247 void insertEntry(HttpHeaderEntry * e);
248 String getList(http_hdr_type id) const;
249 bool getList(http_hdr_type id, String *s) const;
250 String getStrOrList(http_hdr_type id) const;
251 String getByName(const char *name) const;
252 /// sets value and returns true iff a [possibly empty] named field is there
253 bool getByNameIfPresent(const char *name, String &value) const;
254 String getByNameListMember(const char *name, const char *member, const char separator) const;
255 String getListMember(http_hdr_type id, const char *member, const char separator) const;
256 int has(http_hdr_type id) const;
257 void putInt(http_hdr_type id, int number);
258 void putInt64(http_hdr_type id, int64_t number);
259 void putTime(http_hdr_type id, time_t htime);
260 void insertTime(http_hdr_type id, time_t htime);
261 void putStr(http_hdr_type id, const char *str);
262 void putAuth(const char *auth_scheme, const char *realm);
263 void putCc(const HttpHdrCc * cc);
264 void putContRange(const HttpHdrContRange * cr);
265 void putRange(const HttpHdrRange * range);
266 void putSc(HttpHdrSc *sc);
267 void putWarning(const int code, const char *const text); ///< add a Warning header
268 void putExt(const char *name, const char *value);
269 int getInt(http_hdr_type id) const;
270 int64_t getInt64(http_hdr_type id) const;
271 time_t getTime(http_hdr_type id) const;
272 const char *getStr(http_hdr_type id) const;
273 const char *getLastStr(http_hdr_type id) const;
274 HttpHdrCc *getCc() const;
275 HttpHdrRange *getRange() const;
276 HttpHdrSc *getSc() const;
277 HttpHdrContRange *getContRange() const;
278 const char *getAuth(http_hdr_type id, const char *auth_scheme) const;
279 ETag getETag(http_hdr_type id) const;
280 TimeOrTag getTimeOrTag(http_hdr_type id) const;
281 int hasListMember(http_hdr_type id, const char *member, const char separator) const;
282 int hasByNameListMember(const char *name, const char *member, const char separator) const;
283 void removeHopByHopEntries();
284 inline bool chunked() const; ///< whether message uses chunked Transfer-Encoding
285
286 /* protected, do not use these, use interface functions instead */
287 std::vector<HttpHeaderEntry *> entries; /**< parsed fields in raw format */
288 HttpHeaderMask mask; /**< bit set <=> entry present */
289 http_hdr_owner_type owner; /**< request or reply */
290 int len; /**< length when packed, not counting terminating null-byte */
291
292 protected:
293 /** \deprecated Public access replaced by removeHopByHopEntries() */
294 void removeConnectionHeaderEntries();
295
296 private:
297 HttpHeaderEntry *findLastEntry(http_hdr_type id) const;
298 };
299
300 int httpHeaderParseQuotedString(const char *start, const int len, String *val);
301 int httpHeaderHasByNameListMember(const HttpHeader * hdr, const char *name, const char *member, const char separator);
302 void httpHeaderUpdate(HttpHeader * old, const HttpHeader * fresh, const HttpHeaderMask * denied_mask);
303 void httpHeaderCalcMask(HttpHeaderMask * mask, http_hdr_type http_hdr_type_enums[], size_t count);
304
305 inline bool
306 HttpHeader::chunked() const
307 {
308 return has(HDR_TRANSFER_ENCODING) &&
309 hasListMember(HDR_TRANSFER_ENCODING, "chunked", ',');
310 }
311
312 void httpHeaderInitModule(void);
313 void httpHeaderCleanModule(void);
314
315 #endif /* SQUID_HTTPHEADER_H */