Line data Source code
1 1 : /** @file
2 : * @brief HTTP HPACK
3 : */
4 :
5 : /*
6 : * Copyright (c) 2023 Emna Rekik
7 : * Copyright (c) 2024 Nordic Semiconductor ASA
8 : *
9 : * SPDX-License-Identifier: Apache-2.0
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_NET_HTTP_SERVER_HPACK_H_
13 : #define ZEPHYR_INCLUDE_NET_HTTP_SERVER_HPACK_H_
14 :
15 : #include <stddef.h>
16 : #include <stdint.h>
17 :
18 : /**
19 : * @brief HTTP HPACK
20 : * @defgroup http_hpack HTTP HPACK
21 : * @since 3.7
22 : * @version 0.1.0
23 : * @ingroup networking
24 : * @{
25 : */
26 :
27 : #ifdef __cplusplus
28 : extern "C" {
29 : #endif
30 :
31 : /** @cond INTERNAL_HIDDEN */
32 :
33 : enum http_hpack_static_key {
34 : HTTP_SERVER_HPACK_INVALID = 0,
35 : HTTP_SERVER_HPACK_AUTHORITY = 1,
36 : HTTP_SERVER_HPACK_METHOD_GET = 2,
37 : HTTP_SERVER_HPACK_METHOD_POST = 3,
38 : HTTP_SERVER_HPACK_PATH_ROOT = 4,
39 : HTTP_SERVER_HPACK_PATH_INDEX = 5,
40 : HTTP_SERVER_HPACK_SCHEME_HTTP = 6,
41 : HTTP_SERVER_HPACK_SCHEME_HTTPS = 7,
42 : HTTP_SERVER_HPACK_STATUS_200 = 8,
43 : HTTP_SERVER_HPACK_STATUS_204 = 9,
44 : HTTP_SERVER_HPACK_STATUS_206 = 10,
45 : HTTP_SERVER_HPACK_STATUS_304 = 11,
46 : HTTP_SERVER_HPACK_STATUS_400 = 12,
47 : HTTP_SERVER_HPACK_STATUS_404 = 13,
48 : HTTP_SERVER_HPACK_STATUS_500 = 14,
49 : HTTP_SERVER_HPACK_ACCEPT_CHARSET = 15,
50 : HTTP_SERVER_HPACK_ACCEPT_ENCODING = 16,
51 : HTTP_SERVER_HPACK_ACCEPT_LANGUAGE = 17,
52 : HTTP_SERVER_HPACK_ACCEPT_RANGES = 18,
53 : HTTP_SERVER_HPACK_ACCEPT = 19,
54 : HTTP_SERVER_HPACK_ACCESS_CONTROL_ALLOW_ORIGIN = 20,
55 : HTTP_SERVER_HPACK_AGE = 21,
56 : HTTP_SERVER_HPACK_ALLOW = 22,
57 : HTTP_SERVER_HPACK_AUTHORIZATION = 23,
58 : HTTP_SERVER_HPACK_CACHE_CONTROL = 24,
59 : HTTP_SERVER_HPACK_CONTENT_DISPOSITION = 25,
60 : HTTP_SERVER_HPACK_CONTENT_ENCODING = 26,
61 : HTTP_SERVER_HPACK_CONTENT_LANGUAGE = 27,
62 : HTTP_SERVER_HPACK_CONTENT_LENGTH = 28,
63 : HTTP_SERVER_HPACK_CONTENT_LOCATION = 29,
64 : HTTP_SERVER_HPACK_CONTENT_RANGE = 30,
65 : HTTP_SERVER_HPACK_CONTENT_TYPE = 31,
66 : HTTP_SERVER_HPACK_COOKIE = 32,
67 : HTTP_SERVER_HPACK_DATE = 33,
68 : HTTP_SERVER_HPACK_ETAG = 34,
69 : HTTP_SERVER_HPACK_EXPECT = 35,
70 : HTTP_SERVER_HPACK_EXPIRES = 36,
71 : HTTP_SERVER_HPACK_FROM = 37,
72 : HTTP_SERVER_HPACK_HOST = 38,
73 : HTTP_SERVER_HPACK_IF_MATCH = 39,
74 : HTTP_SERVER_HPACK_IF_MODIFIED_SINCE = 40,
75 : HTTP_SERVER_HPACK_IF_NONE_MATCH = 41,
76 : HTTP_SERVER_HPACK_IF_RANGE = 42,
77 : HTTP_SERVER_HPACK_IF_UNMODIFIED_SINCE = 43,
78 : HTTP_SERVER_HPACK_LAST_MODIFIED = 44,
79 : HTTP_SERVER_HPACK_LINK = 45,
80 : HTTP_SERVER_HPACK_LOCATION = 46,
81 : HTTP_SERVER_HPACK_MAX_FORWARDS = 47,
82 : HTTP_SERVER_HPACK_PROXY_AUTHENTICATE = 48,
83 : HTTP_SERVER_HPACK_PROXY_AUTHORIZATION = 49,
84 : HTTP_SERVER_HPACK_RANGE = 50,
85 : HTTP_SERVER_HPACK_REFERER = 51,
86 : HTTP_SERVER_HPACK_REFRESH = 52,
87 : HTTP_SERVER_HPACK_RETRY_AFTER = 53,
88 : HTTP_SERVER_HPACK_SERVER = 54,
89 : HTTP_SERVER_HPACK_SET_COOKIE = 55,
90 : HTTP_SERVER_HPACK_STRICT_TRANSPORT_SECURITY = 56,
91 : HTTP_SERVER_HPACK_TRANSFER_ENCODING = 57,
92 : HTTP_SERVER_HPACK_USER_AGENT = 58,
93 : HTTP_SERVER_HPACK_VARY = 59,
94 : HTTP_SERVER_HPACK_VIA = 60,
95 : HTTP_SERVER_HPACK_WWW_AUTHENTICATE = 61,
96 : };
97 :
98 : /* TODO Kconfig */
99 : #define HTTP2_HEADER_FIELD_MAX_LEN 256
100 :
101 : #if defined(CONFIG_HTTP_SERVER)
102 : #define HTTP_SERVER_HUFFMAN_DECODE_BUFFER_SIZE CONFIG_HTTP_SERVER_HUFFMAN_DECODE_BUFFER_SIZE
103 : #else
104 : #define HTTP_SERVER_HUFFMAN_DECODE_BUFFER_SIZE 0
105 : #endif
106 :
107 : /** @endcond */
108 :
109 : /** HTTP2 header field with decoding buffer. */
110 1 : struct http_hpack_header_buf {
111 : /** A pointer to the decoded header field name. */
112 1 : const char *name;
113 :
114 : /** A pointer to the decoded header field value. */
115 1 : const char *value;
116 :
117 : /** Length of the decoded header field name. */
118 1 : size_t name_len;
119 :
120 : /** Length of the decoded header field value. */
121 1 : size_t value_len;
122 :
123 : /** Encoding/Decoding buffer. Used with Huffman encoding/decoding. */
124 1 : uint8_t buf[HTTP_SERVER_HUFFMAN_DECODE_BUFFER_SIZE];
125 :
126 : /** Length of the data in the decoding buffer. */
127 1 : size_t datalen;
128 : };
129 :
130 : /** @cond INTERNAL_HIDDEN */
131 :
132 : int http_hpack_huffman_decode(const uint8_t *encoded_buf, size_t encoded_len,
133 : uint8_t *buf, size_t buflen);
134 : int http_hpack_huffman_encode(const uint8_t *str, size_t str_len,
135 : uint8_t *buf, size_t buflen);
136 : int http_hpack_decode_header(const uint8_t *buf, size_t datalen,
137 : struct http_hpack_header_buf *header);
138 : int http_hpack_encode_header(uint8_t *buf, size_t buflen,
139 : struct http_hpack_header_buf *header);
140 :
141 : /** @endcond */
142 :
143 : #ifdef __cplusplus
144 : }
145 : #endif
146 :
147 : /**
148 : * @}
149 : */
150 :
151 : #endif
|