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