17#ifndef DETERMINISTICESPASYNCWEBSERVER_H2_FRAME_H
18#define DETERMINISTICESPASYNCWEBSERVER_H2_FRAME_H
28#define H2_PREFACE "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
29#define H2_PREFACE_LEN 24
30#define H2_FRAME_HEADER_LEN 9
37 static constexpr uint8_t H2_DATA = 0x0;
38 static constexpr uint8_t H2_HEADERS = 0x1;
39 static constexpr uint8_t H2_PRIORITY = 0x2;
40 static constexpr uint8_t H2_RST_STREAM = 0x3;
41 static constexpr uint8_t H2_SETTINGS = 0x4;
42 static constexpr uint8_t H2_PUSH_PROMISE = 0x5;
43 static constexpr uint8_t H2_PING = 0x6;
44 static constexpr uint8_t H2_GOAWAY = 0x7;
45 static constexpr uint8_t H2_WINDOW_UPDATE = 0x8;
46 static constexpr uint8_t H2_CONTINUATION = 0x9;
50#define H2_FLAG_END_STREAM 0x01
51#define H2_FLAG_ACK 0x01
52#define H2_FLAG_END_HEADERS 0x04
53#define H2_FLAG_PADDED 0x08
54#define H2_FLAG_PRIORITY 0x20
59 static constexpr uint16_t H2_SETTINGS_HEADER_TABLE_SIZE = 0x1;
60 static constexpr uint16_t H2_SETTINGS_ENABLE_PUSH = 0x2;
61 static constexpr uint16_t H2_SETTINGS_MAX_CONCURRENT_STREAMS = 0x3;
62 static constexpr uint16_t H2_SETTINGS_INITIAL_WINDOW_SIZE = 0x4;
63 static constexpr uint16_t H2_SETTINGS_MAX_FRAME_SIZE = 0x5;
64 static constexpr uint16_t H2_SETTINGS_MAX_HEADER_LIST_SIZE = 0x6;
70 static constexpr uint32_t H2_NO_ERROR = 0x0;
71 static constexpr uint32_t H2_PROTOCOL_ERROR = 0x1;
72 static constexpr uint32_t H2_INTERNAL_ERROR = 0x2;
73 static constexpr uint32_t H2_FLOW_CONTROL_ERROR = 0x3;
74 static constexpr uint32_t H2_SETTINGS_TIMEOUT = 0x4;
75 static constexpr uint32_t H2_STREAM_CLOSED = 0x5;
76 static constexpr uint32_t H2_FRAME_SIZE_ERROR = 0x6;
77 static constexpr uint32_t H2_REFUSED_STREAM = 0x7;
78 static constexpr uint32_t H2_CANCEL = 0x8;
79 static constexpr uint32_t H2_COMPRESSION_ERROR = 0x9;
80 static constexpr uint32_t H2_CONNECT_ERROR = 0xa;
81 static constexpr uint32_t H2_ENHANCE_YOUR_CALM = 0xb;
82 static constexpr uint32_t H2_INADEQUATE_SECURITY = 0xc;
83 static constexpr uint32_t H2_HTTP_1_1_REQUIRED = 0xd;
98 uint32_t header_table_size;
100 uint32_t max_concurrent_streams;
101 uint32_t initial_window_size;
102 uint32_t max_frame_size;
103 uint32_t max_header_list_size;
107bool h2_parse_header(
const uint8_t *buf,
size_t len, H2FrameHeader *out);
110size_t h2_write_header(uint8_t *out,
size_t cap, uint32_t length, uint8_t type, uint8_t flags, uint32_t stream_id);
113void h2_settings_defaults(H2Settings *s);
115bool h2_parse_settings(
const uint8_t *payload,
size_t len, H2Settings *s);
120size_t h2_build_settings(uint8_t *out,
size_t cap,
const uint16_t *ids,
const uint32_t *vals,
size_t n);
122size_t h2_build_settings_ack(uint8_t *out,
size_t cap);
124size_t h2_build_window_update(uint8_t *out,
size_t cap, uint32_t stream_id, uint32_t increment);
126size_t h2_build_rst_stream(uint8_t *out,
size_t cap, uint32_t stream_id, uint32_t error);
128size_t h2_build_goaway(uint8_t *out,
size_t cap, uint32_t last_stream_id, uint32_t error);
130size_t h2_build_ping_ack(uint8_t *out,
size_t cap,
const uint8_t opaque[8]);
132size_t h2_build_headers(uint8_t *out,
size_t cap, uint32_t stream_id,
const uint8_t *block,
size_t block_len,
135size_t h2_build_data(uint8_t *out,
size_t cap, uint32_t stream_id,
const uint8_t *data,
size_t data_len,
User-facing configuration for DeterministicESPAsyncWebServer.