40#ifndef __NILOREA_HTTP2_HEADER
41#define __NILOREA_HTTP2_HEADER
51#define N_H2_PREFACE "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
53#define N_H2_FRAME_HEADER_LEN 9
55#define N_H2_MAX_FRAME_PAYLOAD 16384
60#define N_H2_HEADERS 0x1
61#define N_H2_PRIORITY 0x2
62#define N_H2_RST_STREAM 0x3
63#define N_H2_SETTINGS 0x4
64#define N_H2_PUSH_PROMISE 0x5
66#define N_H2_GOAWAY 0x7
67#define N_H2_WINDOW_UPDATE 0x8
68#define N_H2_CONTINUATION 0x9
73#define N_H2_FLAG_END_STREAM 0x1
74#define N_H2_FLAG_ACK 0x1
75#define N_H2_FLAG_END_HEADERS 0x4
76#define N_H2_FLAG_PADDED 0x8
77#define N_H2_FLAG_PRIORITY 0x20
82#define N_H2_SETTINGS_HEADER_TABLE_SIZE 0x1
83#define N_H2_SETTINGS_ENABLE_PUSH 0x2
84#define N_H2_SETTINGS_MAX_CONCURRENT_STREAMS 0x3
85#define N_H2_SETTINGS_INITIAL_WINDOW_SIZE 0x4
86#define N_H2_SETTINGS_MAX_FRAME_SIZE 0x5
87#define N_H2_SETTINGS_MAX_HEADER_LIST_SIZE 0x6
112size_t n_http2_frame_build_header(
unsigned char* out,
size_t out_cap, uint32_t length,
int type,
int flags, uint32_t stream_id);
120#define N_H2_HPACK_DEFAULT_TABLE_SIZE 4096
HPACK codec context: the dynamic table (index 0 = most recently added)
int n_http2_hpack_decode(N_H2_HPACK *ctx, const unsigned char *block, size_t len, N_H2_HEADER *out, size_t max_out, size_t *count)
decode an HPACK header block into out[] (owned name/value strings).
char * value
header field value (owned after decode)
size_t n_http2_hpack_encode(const N_H2_HEADER *headers, size_t n, unsigned char *out, size_t out_cap)
encode a header list into a block using literal representations without indexing and without Huffman ...
N_H2_HPACK * n_http2_hpack_new(size_t max_table_size)
create an HPACK codec context with the given dynamic table size limit (0 uses N_H2_HPACK_DEFAULT_TABL...
uint32_t value
parameter value
char * name
header field name (owned after decode)
uint16_t id
parameter identifier (N_H2_SETTINGS_*)
void n_http2_hpack_headers_free(N_H2_HEADER *headers, size_t n)
free the owned name/value strings of a decoded header array (does not free the array itself)
int n_http2_settings_parse(const unsigned char *payload, size_t len, N_H2_SETTING *out, size_t max, size_t *count)
parse a SETTINGS frame payload (6-byte id/value entries) into out.
uint32_t length
payload length (24-bit)
const unsigned char * payload
pointer into the input buffer (may be NULL when length is 0)
int type
frame type (N_H2_*)
uint32_t stream_id
stream identifier (31-bit; the reserved bit is cleared)
int n_http2_frame_parse(const unsigned char *buf, size_t len, N_H2_FRAME *frame, size_t *consumed)
parse one HTTP/2 frame from a byte buffer (stateless).
size_t n_http2_frame_build_header(unsigned char *out, size_t out_cap, uint32_t length, int type, int flags, uint32_t stream_id)
write a 9-byte HTTP/2 frame header into out.
void n_http2_hpack_free(N_H2_HPACK **ctx)
free an HPACK codec context and NULL the caller's pointer
void n_http2_hpack_set_max_size(N_H2_HPACK *ctx, size_t max_table_size)
change the dynamic table size limit (a SETTINGS_HEADER_TABLE_SIZE change), evicting entries as needed...
a parsed HTTP/2 frame; payload aliases the input buffer
one HPACK header field; after a decode both strings are owned (heap)
one SETTINGS parameter (identifier and value)