summaryrefslogtreecommitdiff
path: root/src/http_header.h
blob: 7e32da4488d1fc1c68ce3067127e14a03fb40666 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#ifndef INCLUDED_HTTP_HEADER_H
#define INCLUDED_HTTP_HEADER_H
#include "first.h"

#include "base_decls.h"
#include "buffer.h"

/* HTTP header enum for select HTTP field-names
 * reference:
 *   https://www.iana.org/assignments/message-headers/message-headers.xml
 *   https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
 */
/* Note: must be kept in sync with http_header.c http_headers[] */
/* Note: must be kept in sync h2.c:http_header_lc[] */
/* Note: must be kept in sync h2.c:http_header_lshpack_idx[] */
/* Note: must be kept in sync h2.c:lshpack_idx_http_header[] */
/* Note: when adding new items, must replace OTHER in existing code for item */
/* Note: current implementation has limit of 64 htags
 *       Use of htags is an optimization for quick existence checks in lighttpd.
 *       (In the future, these values may also be used to map to HPACK indices.)
 *       However, listing all possible headers here is highly discouraged,
 *       as extending the bitmap greater than 64-bits may make quick bitmasks
 *       check more expensive, and the cost for looking up unmarked headers
 *       (HTTP_HEADER_OTHER) is not substantially more.  In the future, this
 *       list may be revisitied and reviewed, and less frequent headers removed
 *       or replaced.
 */
enum http_header_e {
  HTTP_HEADER_OTHER = 0
 ,HTTP_HEADER_ACCEPT
 ,HTTP_HEADER_ACCEPT_ENCODING
 ,HTTP_HEADER_ACCEPT_LANGUAGE
 ,HTTP_HEADER_ACCEPT_RANGES
 ,HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN
 ,HTTP_HEADER_AGE
 ,HTTP_HEADER_ALLOW
 ,HTTP_HEADER_ALT_SVC
 ,HTTP_HEADER_ALT_USED
 ,HTTP_HEADER_AUTHORIZATION
 ,HTTP_HEADER_CACHE_CONTROL
 ,HTTP_HEADER_CONNECTION
 ,HTTP_HEADER_CONTENT_ENCODING
 ,HTTP_HEADER_CONTENT_LENGTH
 ,HTTP_HEADER_CONTENT_LOCATION
 ,HTTP_HEADER_CONTENT_RANGE
 ,HTTP_HEADER_CONTENT_SECURITY_POLICY
 ,HTTP_HEADER_CONTENT_TYPE
 ,HTTP_HEADER_COOKIE
 ,HTTP_HEADER_DATE
 ,HTTP_HEADER_DNT
 ,HTTP_HEADER_ETAG
 ,HTTP_HEADER_EXPECT
 ,HTTP_HEADER_EXPECT_CT
 ,HTTP_HEADER_EXPIRES
 ,HTTP_HEADER_FORWARDED
 ,HTTP_HEADER_HOST
 ,HTTP_HEADER_HTTP2_SETTINGS
 ,HTTP_HEADER_IF_MATCH
 ,HTTP_HEADER_IF_MODIFIED_SINCE
 ,HTTP_HEADER_IF_NONE_MATCH
 ,HTTP_HEADER_IF_RANGE
 ,HTTP_HEADER_IF_UNMODIFIED_SINCE
 ,HTTP_HEADER_LAST_MODIFIED
 ,HTTP_HEADER_LINK
 ,HTTP_HEADER_LOCATION
 ,HTTP_HEADER_ONION_LOCATION
 ,HTTP_HEADER_P3P
 ,HTTP_HEADER_PRAGMA
 ,HTTP_HEADER_RANGE
 ,HTTP_HEADER_REFERER
 ,HTTP_HEADER_REFERRER_POLICY
 ,HTTP_HEADER_SERVER
 ,HTTP_HEADER_SET_COOKIE
 ,HTTP_HEADER_STATUS
 ,HTTP_HEADER_STRICT_TRANSPORT_SECURITY
 ,HTTP_HEADER_TE
 ,HTTP_HEADER_TRANSFER_ENCODING
 ,HTTP_HEADER_UPGRADE
 ,HTTP_HEADER_UPGRADE_INSECURE_REQUESTS
 ,HTTP_HEADER_USER_AGENT
 ,HTTP_HEADER_VARY
 ,HTTP_HEADER_WWW_AUTHENTICATE
 ,HTTP_HEADER_X_CONTENT_TYPE_OPTIONS
 ,HTTP_HEADER_X_FORWARDED_FOR
 ,HTTP_HEADER_X_FORWARDED_PROTO
 ,HTTP_HEADER_X_FRAME_OPTIONS
 ,HTTP_HEADER_X_XSS_PROTECTION
};

__attribute_pure__
enum http_header_e http_header_hkey_get(const char *s, uint32_t slen);
__attribute_pure__
enum http_header_e http_header_hkey_get_lc(const char *s, uint32_t slen);

__attribute_pure__
int http_header_str_to_code (const char * const s);

__attribute_pure__
int http_header_str_contains_token (const char *s, uint32_t slen, const char *m, uint32_t mlen);

int http_header_remove_token (buffer * const b, const char * const m, const uint32_t mlen);

__attribute_pure__
buffer * http_header_response_get(const request_st *r, enum http_header_e id, const char *k, uint32_t klen);
void http_header_response_unset(request_st *r, enum http_header_e id, const char *k, uint32_t klen);
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);
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);
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);

__attribute_pure__
buffer * http_header_request_get(const request_st *r, enum http_header_e id, const char *k, uint32_t klen);
void http_header_request_unset(request_st *r, enum http_header_e id, const char *k, uint32_t klen);
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);
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);

__attribute_pure__
buffer * http_header_env_get(const request_st *r, const char *k, uint32_t klen);
void http_header_env_set(request_st *r, const char *k, uint32_t klen, const char *v, uint32_t vlen);
void http_header_env_append(request_st *r, const char *k, uint32_t klen, const char *v, uint32_t vlen);

__attribute_hot__
uint32_t http_header_parse_hoff (const char *n, const uint32_t clen, unsigned short hoff[8192]);

#endif