Zephyr API Documentation 4.5.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
hpack.h
Go to the documentation of this file.
1
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_HPACK_H_
13#define ZEPHYR_INCLUDE_NET_HTTP_HPACK_H_
14
15#include <stdbool.h>
16#include <stddef.h>
17#include <stdint.h>
18
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
33
34enum http_hpack_static_key {
35 HTTP_SERVER_HPACK_INVALID = 0,
36 HTTP_SERVER_HPACK_AUTHORITY = 1,
37 HTTP_SERVER_HPACK_METHOD_GET = 2,
38 HTTP_SERVER_HPACK_METHOD_POST = 3,
39 HTTP_SERVER_HPACK_PATH_ROOT = 4,
40 HTTP_SERVER_HPACK_PATH_INDEX = 5,
41 HTTP_SERVER_HPACK_SCHEME_HTTP = 6,
42 HTTP_SERVER_HPACK_SCHEME_HTTPS = 7,
43 HTTP_SERVER_HPACK_STATUS_200 = 8,
44 HTTP_SERVER_HPACK_STATUS_204 = 9,
45 HTTP_SERVER_HPACK_STATUS_206 = 10,
46 HTTP_SERVER_HPACK_STATUS_304 = 11,
47 HTTP_SERVER_HPACK_STATUS_400 = 12,
48 HTTP_SERVER_HPACK_STATUS_404 = 13,
49 HTTP_SERVER_HPACK_STATUS_500 = 14,
50 HTTP_SERVER_HPACK_ACCEPT_CHARSET = 15,
51 HTTP_SERVER_HPACK_ACCEPT_ENCODING = 16,
52 HTTP_SERVER_HPACK_ACCEPT_LANGUAGE = 17,
53 HTTP_SERVER_HPACK_ACCEPT_RANGES = 18,
54 HTTP_SERVER_HPACK_ACCEPT = 19,
55 HTTP_SERVER_HPACK_ACCESS_CONTROL_ALLOW_ORIGIN = 20,
56 HTTP_SERVER_HPACK_AGE = 21,
57 HTTP_SERVER_HPACK_ALLOW = 22,
58 HTTP_SERVER_HPACK_AUTHORIZATION = 23,
59 HTTP_SERVER_HPACK_CACHE_CONTROL = 24,
60 HTTP_SERVER_HPACK_CONTENT_DISPOSITION = 25,
61 HTTP_SERVER_HPACK_CONTENT_ENCODING = 26,
62 HTTP_SERVER_HPACK_CONTENT_LANGUAGE = 27,
63 HTTP_SERVER_HPACK_CONTENT_LENGTH = 28,
64 HTTP_SERVER_HPACK_CONTENT_LOCATION = 29,
65 HTTP_SERVER_HPACK_CONTENT_RANGE = 30,
66 HTTP_SERVER_HPACK_CONTENT_TYPE = 31,
67 HTTP_SERVER_HPACK_COOKIE = 32,
68 HTTP_SERVER_HPACK_DATE = 33,
69 HTTP_SERVER_HPACK_ETAG = 34,
70 HTTP_SERVER_HPACK_EXPECT = 35,
71 HTTP_SERVER_HPACK_EXPIRES = 36,
72 HTTP_SERVER_HPACK_FROM = 37,
73 HTTP_SERVER_HPACK_HOST = 38,
74 HTTP_SERVER_HPACK_IF_MATCH = 39,
75 HTTP_SERVER_HPACK_IF_MODIFIED_SINCE = 40,
76 HTTP_SERVER_HPACK_IF_NONE_MATCH = 41,
77 HTTP_SERVER_HPACK_IF_RANGE = 42,
78 HTTP_SERVER_HPACK_IF_UNMODIFIED_SINCE = 43,
79 HTTP_SERVER_HPACK_LAST_MODIFIED = 44,
80 HTTP_SERVER_HPACK_LINK = 45,
81 HTTP_SERVER_HPACK_LOCATION = 46,
82 HTTP_SERVER_HPACK_MAX_FORWARDS = 47,
83 HTTP_SERVER_HPACK_PROXY_AUTHENTICATE = 48,
84 HTTP_SERVER_HPACK_PROXY_AUTHORIZATION = 49,
85 HTTP_SERVER_HPACK_RANGE = 50,
86 HTTP_SERVER_HPACK_REFERER = 51,
87 HTTP_SERVER_HPACK_REFRESH = 52,
88 HTTP_SERVER_HPACK_RETRY_AFTER = 53,
89 HTTP_SERVER_HPACK_SERVER = 54,
90 HTTP_SERVER_HPACK_SET_COOKIE = 55,
91 HTTP_SERVER_HPACK_STRICT_TRANSPORT_SECURITY = 56,
92 HTTP_SERVER_HPACK_TRANSFER_ENCODING = 57,
93 HTTP_SERVER_HPACK_USER_AGENT = 58,
94 HTTP_SERVER_HPACK_VARY = 59,
95 HTTP_SERVER_HPACK_VIA = 60,
96 HTTP_SERVER_HPACK_WWW_AUTHENTICATE = 61,
97};
98
99/* TODO Kconfig */
100#define HTTP2_HEADER_FIELD_MAX_LEN 256
101
102#if defined(CONFIG_HTTP_SERVER)
103#define HTTP_SERVER_HUFFMAN_DECODE_BUFFER_SIZE CONFIG_HTTP_SERVER_HUFFMAN_DECODE_BUFFER_SIZE
104#else
105#define HTTP_SERVER_HUFFMAN_DECODE_BUFFER_SIZE 0
106#endif
107
109
117
122
125
130
132 const char *name;
133
135 const char *value;
136
138 size_t name_len;
139
141 size_t value_len;
142
144 uint8_t buf[HTTP_SERVER_HUFFMAN_DECODE_BUFFER_SIZE];
145
147 size_t datalen;
148};
149
151
152int http_hpack_huffman_decode(const uint8_t *encoded_buf, size_t encoded_len,
153 uint8_t *buf, size_t buflen);
154int http_hpack_huffman_encode(const uint8_t *str, size_t str_len,
155 uint8_t *buf, size_t buflen);
156int http_hpack_decode_header(const uint8_t *buf, size_t datalen,
157 struct http_hpack_header_buf *header);
158int http_hpack_encode_header(uint8_t *buf, size_t buflen,
159 struct http_hpack_header_buf *header);
160int http_hpack_encode_field(uint8_t *buf, size_t buflen, struct http_hpack_header_buf *header,
161 const char *name, const char *value);
162
164
165#ifdef __cplusplus
166}
167#endif
168
172
173#endif /* ZEPHYR_INCLUDE_NET_HTTP_HPACK_H_ */
http_hpack_entry_type
Kind of HPACK entry decoded.
Definition hpack.h:111
@ HTTP_HPACK_ENTRY_TABLE_SIZE_UPDATE
A dynamic table size update, carrying no field.
Definition hpack.h:115
@ HTTP_HPACK_ENTRY_FIELD
A header field.
Definition hpack.h:113
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
HTTP2 header field with decoding buffer.
Definition hpack.h:119
enum http_hpack_entry_type type
Kind of the entry decoded last.
Definition hpack.h:121
size_t value_len
Length of the decoded header field value.
Definition hpack.h:141
uint8_t buf[HTTP_SERVER_HUFFMAN_DECODE_BUFFER_SIZE]
Encoding/Decoding buffer.
Definition hpack.h:144
bool oversized
Whether a string of the field was larger than the decoding buffer and was dropped.
Definition hpack.h:129
const char * value
A pointer to the decoded header field value.
Definition hpack.h:135
size_t datalen
Length of the data in the decoding buffer.
Definition hpack.h:147
uint32_t table_size
Dynamic table size requested by a size update entry.
Definition hpack.h:124
const char * name
A pointer to the decoded header field name.
Definition hpack.h:132
size_t name_len
Length of the decoded header field name.
Definition hpack.h:138