xref: /lighttpd1.4/src/http_header.h (revision 25f5085a)
13dd3cde9SGlenn Strauss #ifndef INCLUDED_HTTP_HEADER_H
23dd3cde9SGlenn Strauss #define INCLUDED_HTTP_HEADER_H
33dd3cde9SGlenn Strauss #include "first.h"
43dd3cde9SGlenn Strauss 
53dd3cde9SGlenn Strauss #include "base_decls.h"
63dd3cde9SGlenn Strauss #include "buffer.h"
73dd3cde9SGlenn Strauss 
8367f30a6SGlenn Strauss /* HTTP header enum for select HTTP field-names
9367f30a6SGlenn Strauss  * reference:
10367f30a6SGlenn Strauss  *   https://www.iana.org/assignments/message-headers/message-headers.xml
11367f30a6SGlenn Strauss  *   https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
12367f30a6SGlenn Strauss  */
133dd3cde9SGlenn Strauss /* Note: must be kept in sync with http_header.c http_headers[] */
143fbb5773SGlenn Strauss /* Note: must be kept in sync h2.c:http_header_lc[] */
153fbb5773SGlenn Strauss /* Note: must be kept in sync h2.c:http_header_lshpack_idx[] */
163fbb5773SGlenn Strauss /* Note: must be kept in sync h2.c:lshpack_idx_http_header[] */
173dd3cde9SGlenn Strauss /* Note: when adding new items, must replace OTHER in existing code for item */
18367f30a6SGlenn Strauss /* Note: current implementation has limit of 64 htags
19367f30a6SGlenn Strauss  *       Use of htags is an optimization for quick existence checks in lighttpd.
20367f30a6SGlenn Strauss  *       (In the future, these values may also be used to map to HPACK indices.)
21367f30a6SGlenn Strauss  *       However, listing all possible headers here is highly discouraged,
22367f30a6SGlenn Strauss  *       as extending the bitmap greater than 64-bits may make quick bitmasks
23367f30a6SGlenn Strauss  *       check more expensive, and the cost for looking up unmarked headers
24367f30a6SGlenn Strauss  *       (HTTP_HEADER_OTHER) is not substantially more.  In the future, this
25*25f5085aSGlenn Strauss  *       list may be revisited and reviewed, and less frequent headers removed
26367f30a6SGlenn Strauss  *       or replaced.
27367f30a6SGlenn Strauss  */
280f90a9e3SGlenn Strauss enum http_header_h2_e { /* pseudo-headers */
290f90a9e3SGlenn Strauss   HTTP_HEADER_H2_UNKNOWN         = -1
300f90a9e3SGlenn Strauss  ,HTTP_HEADER_H2_AUTHORITY       = -2
310f90a9e3SGlenn Strauss  ,HTTP_HEADER_H2_METHOD_GET      = -3
320f90a9e3SGlenn Strauss  ,HTTP_HEADER_H2_METHOD_POST     = -4
330f90a9e3SGlenn Strauss  ,HTTP_HEADER_H2_PATH            = -5
340f90a9e3SGlenn Strauss  ,HTTP_HEADER_H2_PATH_INDEX_HTML = -6
350f90a9e3SGlenn Strauss  ,HTTP_HEADER_H2_SCHEME_HTTP     = -7
360f90a9e3SGlenn Strauss  ,HTTP_HEADER_H2_SCHEME_HTTPS    = -8
375d1aa5d0SGlenn Strauss  ,HTTP_HEADER_H2_PROTOCOL        = -9
380f90a9e3SGlenn Strauss };
393dd3cde9SGlenn Strauss enum http_header_e {
402e0676fdSGlenn Strauss   HTTP_HEADER_OTHER = 0
41367f30a6SGlenn Strauss  ,HTTP_HEADER_ACCEPT
42babf0d0eSGlenn Strauss  ,HTTP_HEADER_ACCEPT_ENCODING
43367f30a6SGlenn Strauss  ,HTTP_HEADER_ACCEPT_LANGUAGE
44367f30a6SGlenn Strauss  ,HTTP_HEADER_ACCEPT_RANGES
45367f30a6SGlenn Strauss  ,HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN
46367f30a6SGlenn Strauss  ,HTTP_HEADER_AGE
47367f30a6SGlenn Strauss  ,HTTP_HEADER_ALLOW
48367f30a6SGlenn Strauss  ,HTTP_HEADER_ALT_SVC
49367f30a6SGlenn Strauss  ,HTTP_HEADER_ALT_USED
50babf0d0eSGlenn Strauss  ,HTTP_HEADER_AUTHORIZATION
51babf0d0eSGlenn Strauss  ,HTTP_HEADER_CACHE_CONTROL
52babf0d0eSGlenn Strauss  ,HTTP_HEADER_CONNECTION
53babf0d0eSGlenn Strauss  ,HTTP_HEADER_CONTENT_ENCODING
54babf0d0eSGlenn Strauss  ,HTTP_HEADER_CONTENT_LENGTH
55babf0d0eSGlenn Strauss  ,HTTP_HEADER_CONTENT_LOCATION
56367f30a6SGlenn Strauss  ,HTTP_HEADER_CONTENT_RANGE
57367f30a6SGlenn Strauss  ,HTTP_HEADER_CONTENT_SECURITY_POLICY
58babf0d0eSGlenn Strauss  ,HTTP_HEADER_CONTENT_TYPE
59babf0d0eSGlenn Strauss  ,HTTP_HEADER_COOKIE
60babf0d0eSGlenn Strauss  ,HTTP_HEADER_DATE
61367f30a6SGlenn Strauss  ,HTTP_HEADER_DNT
62babf0d0eSGlenn Strauss  ,HTTP_HEADER_ETAG
63babf0d0eSGlenn Strauss  ,HTTP_HEADER_EXPECT
64367f30a6SGlenn Strauss  ,HTTP_HEADER_EXPECT_CT
65367f30a6SGlenn Strauss  ,HTTP_HEADER_EXPIRES
66babf0d0eSGlenn Strauss  ,HTTP_HEADER_FORWARDED
67babf0d0eSGlenn Strauss  ,HTTP_HEADER_HOST
68367f30a6SGlenn Strauss  ,HTTP_HEADER_HTTP2_SETTINGS
69367f30a6SGlenn Strauss  ,HTTP_HEADER_IF_MATCH
70babf0d0eSGlenn Strauss  ,HTTP_HEADER_IF_MODIFIED_SINCE
71babf0d0eSGlenn Strauss  ,HTTP_HEADER_IF_NONE_MATCH
72367f30a6SGlenn Strauss  ,HTTP_HEADER_IF_RANGE
73367f30a6SGlenn Strauss  ,HTTP_HEADER_IF_UNMODIFIED_SINCE
74babf0d0eSGlenn Strauss  ,HTTP_HEADER_LAST_MODIFIED
75367f30a6SGlenn Strauss  ,HTTP_HEADER_LINK
76babf0d0eSGlenn Strauss  ,HTTP_HEADER_LOCATION
77367f30a6SGlenn Strauss  ,HTTP_HEADER_ONION_LOCATION
78367f30a6SGlenn Strauss  ,HTTP_HEADER_P3P
79367f30a6SGlenn Strauss  ,HTTP_HEADER_PRAGMA
809a3f6c52SGlenn Strauss  ,HTTP_HEADER_PRIORITY
81babf0d0eSGlenn Strauss  ,HTTP_HEADER_RANGE
82367f30a6SGlenn Strauss  ,HTTP_HEADER_REFERER
83367f30a6SGlenn Strauss  ,HTTP_HEADER_REFERRER_POLICY
84babf0d0eSGlenn Strauss  ,HTTP_HEADER_SERVER
85babf0d0eSGlenn Strauss  ,HTTP_HEADER_SET_COOKIE
86babf0d0eSGlenn Strauss  ,HTTP_HEADER_STATUS
87367f30a6SGlenn Strauss  ,HTTP_HEADER_STRICT_TRANSPORT_SECURITY
88367f30a6SGlenn Strauss  ,HTTP_HEADER_TE
89babf0d0eSGlenn Strauss  ,HTTP_HEADER_TRANSFER_ENCODING
90babf0d0eSGlenn Strauss  ,HTTP_HEADER_UPGRADE
91367f30a6SGlenn Strauss  ,HTTP_HEADER_UPGRADE_INSECURE_REQUESTS
92babf0d0eSGlenn Strauss  ,HTTP_HEADER_USER_AGENT
93babf0d0eSGlenn Strauss  ,HTTP_HEADER_VARY
94367f30a6SGlenn Strauss  ,HTTP_HEADER_WWW_AUTHENTICATE
95367f30a6SGlenn Strauss  ,HTTP_HEADER_X_CONTENT_TYPE_OPTIONS
96babf0d0eSGlenn Strauss  ,HTTP_HEADER_X_FORWARDED_FOR
97babf0d0eSGlenn Strauss  ,HTTP_HEADER_X_FORWARDED_PROTO
98367f30a6SGlenn Strauss  ,HTTP_HEADER_X_FRAME_OPTIONS
99367f30a6SGlenn Strauss  ,HTTP_HEADER_X_XSS_PROTECTION
1003dd3cde9SGlenn Strauss };
1013dd3cde9SGlenn Strauss 
10249ed72ceSGlenn Strauss __attribute_pure__
103f8bd028dSGlenn Strauss enum http_header_e http_header_hkey_get(const char *s, size_t slen);
10492e5a021SGlenn Strauss __attribute_pure__
105f8bd028dSGlenn Strauss enum http_header_e http_header_hkey_get_lc(const char *s, size_t slen);
1063dd3cde9SGlenn Strauss 
107e2b4c309SGlenn Strauss __attribute_pure__
10810dbe38aSGlenn Strauss int http_header_str_to_code (const char * const s);
10910dbe38aSGlenn Strauss 
11010dbe38aSGlenn Strauss __attribute_pure__
111a200e0c2SGlenn Strauss int http_header_str_contains_token (const char *s, uint32_t slen, const char *m, uint32_t mlen);
112e2b4c309SGlenn Strauss 
1130fb391c0SGlenn Strauss int http_header_remove_token (buffer * const b, const char * const m, const uint32_t mlen);
1140fb391c0SGlenn Strauss 
115785037ddSGlenn Strauss __attribute_pure__
116a200e0c2SGlenn Strauss buffer * http_header_response_get(const request_st *r, enum http_header_e id, const char *k, uint32_t klen);
11726f354cbSGlenn Strauss __attribute_returns_nonnull__
11826f354cbSGlenn Strauss buffer * http_header_response_set_ptr(request_st *r, enum http_header_e id, const char *k, uint32_t klen);
119a200e0c2SGlenn Strauss void http_header_response_unset(request_st *r, enum http_header_e id, const char *k, uint32_t klen);
120a200e0c2SGlenn Strauss void http_header_response_set(request_st *r, enum http_header_e id, const char *k, uint32_t klen, const char *v, uint32_t vlen);
121a200e0c2SGlenn Strauss void http_header_response_append(request_st *r, enum http_header_e id, const char *k, uint32_t klen, const char *v, uint32_t vlen);
122a200e0c2SGlenn Strauss void http_header_response_insert(request_st *r, enum http_header_e id, const char *k, uint32_t klen, const char *v, uint32_t vlen);
1233dd3cde9SGlenn Strauss 
124785037ddSGlenn Strauss __attribute_pure__
125a200e0c2SGlenn Strauss buffer * http_header_request_get(const request_st *r, enum http_header_e id, const char *k, uint32_t klen);
12626f354cbSGlenn Strauss __attribute_returns_nonnull__
12726f354cbSGlenn Strauss buffer * http_header_request_set_ptr(request_st *r, enum http_header_e id, const char *k, uint32_t klen);
128a200e0c2SGlenn Strauss void http_header_request_unset(request_st *r, enum http_header_e id, const char *k, uint32_t klen);
129a200e0c2SGlenn Strauss void http_header_request_set(request_st *r, enum http_header_e id, const char *k, uint32_t klen, const char *v, uint32_t vlen);
130a200e0c2SGlenn Strauss void http_header_request_append(request_st *r, enum http_header_e id, const char *k, uint32_t klen, const char *v, uint32_t vlen);
1313dd3cde9SGlenn Strauss 
132785037ddSGlenn Strauss __attribute_pure__
133a200e0c2SGlenn Strauss buffer * http_header_env_get(const request_st *r, const char *k, uint32_t klen);
13426f354cbSGlenn Strauss __attribute_returns_nonnull__
13526f354cbSGlenn Strauss buffer * http_header_env_set_ptr(request_st *r, const char *k, uint32_t klen);
136a200e0c2SGlenn Strauss void http_header_env_set(request_st *r, const char *k, uint32_t klen, const char *v, uint32_t vlen);
137a200e0c2SGlenn Strauss void http_header_env_append(request_st *r, const char *k, uint32_t klen, const char *v, uint32_t vlen);
1383dd3cde9SGlenn Strauss 
139db7b51a4SGlenn Strauss __attribute_hot__
140db7b51a4SGlenn Strauss uint32_t http_header_parse_hoff (const char *n, const uint32_t clen, unsigned short hoff[8192]);
141db7b51a4SGlenn Strauss 
1423dd3cde9SGlenn Strauss #endif
143