Skip to main content

C/C++ HTTP/3 API Reference

Preliminaries​

The declarations are all in tquic.h, so you just need to include it in each source file:

#include <tquic.h>

Common types​

The TQUIC HTTP/3 library defines several types that are commonly used by its public functions.

TypesDescription
http3_config_tThe behavior of the HTTP/3 library can be managed through various parameters in http3_config_t.
http3_conn_tHTTP/3 connection, which can manitain muliple requests simultaneously.
http3_header_tHTTP/3 header structure.
http3_headers_tHTTP/3 headers list.
http3_methods_tThe structure lists the callbacks used by the connection to interact with the user code.
http3_context_tUser-provided HTTP/3 context that can be used to associate information during event callbacks.
http3_priority_tExtensible HTTP/3 priority, as described in RFC9218.

Configurations​

HTTP/3 configurations initialization​

http3_config_new​

struct http3_config_t *http3_config_new(void);
  • Create an instance of http3_config_t and initialize it with default values. The caller is responsible for managing the memory and should free it by calling http3_config_free.

http3_config_free​

void http3_config_free(struct http3_config_t *config);
  • Free HTTP/3 configuration.

HTTP/3 configurations customization​

http3_config_set_max_field_section_size​

void http3_config_set_max_field_section_size(struct http3_config_t *config, uint64_t v);
  • Set the max_field_section_size setting parameter in bytes.
  • The default value is set to 0, which means there is no limit on the size of headers received from the peer. The calculation rules for headers size constraints can be found in RFC9114 Headers Size Constraints.

HTTP/3 Connection​

Instantiation and destruction​

http3_conn_new​

struct http3_conn_t *http3_conn_new(struct quic_conn_t *quic_conn, struct http3_config_t *config);
  • Create an HTTP/3 connection. The caller is responsible for the memory of the connection and properly free it by calling http3_conn_free.

http3_conn_free​

void http3_conn_free(struct http3_conn_t *conn);
  • Free an HTTP/3 connection.

Event-driven and Callbacks​

http3_conn_set_events_handler​

void http3_conn_set_events_handler(struct http3_conn_t *conn,
const struct http3_methods_t *methods,
http3_context_t context);
  • Sets the callback and context for processing HTTP/3 connection events.

http3_conn_process_streams​

int http3_conn_process_streams(struct http3_conn_t *conn, struct quic_conn_t *quic_conn);
  • Drives the HTTP/3 connection to process internal events for all maintained streams.

HTTP/3 Callbacks​

The http3_methods_t lists the callbacks used by the HTTP/3 connection to interact with the user code.

on_stream_headers​

typedef struct http3_methods_t {
void (*on_stream_headers)(void *ctx, uint64_t stream_id, const struct http3_headers_t *headers, bool fin);
/* ... */
} http3_methods_t;
  • on_stream_headers is called when request or response headers are received from the peer. In this callback, the upper-layer application can parse the headers using http3_for_each_header.

on_stream_data​

typedef struct http3_methods_t {
void (*on_stream_data)(void *ctx, uint64_t stream_id);
/* ... */
} http3_methods_t;
  • on_stream_data is called when DATA frames are received from the peer. Note that this event is edge-triggered.

on_stream_finished​

typedef struct http3_methods_t {
void (*on_stream_finished)(void *ctx, uint64_t stream_id);
/* ... */
} http3_methods_t;
  • on_stream_finished is called when all incoming data for a stream has been read.

on_stream_reset​

typedef struct http3_methods_t {
void (*on_stream_reset)(void *ctx, uint64_t stream_id, uint64_t error_code);
/* ... */
} http3_methods_t;
  • on_stream_reset is called when a RESET_STREAM frame is received from the peer. This callback is optional.

on_stream_priority_update​

typedef struct http3_methods_t {
void (*on_stream_priority_update)(void *ctx, uint64_t stream_id);
/* ... */
} http3_methods_t;
  • on_stream_priority_update is called when a PRIORITY_UPDATE frame is received from the peer. This callback is optional, and the upper-layer application can use http3_take_priority_update to get the priority update info for the associated stream.

on_conn_goaway​

typedef struct http3_methods_t {
void (*on_conn_goaway)(void *ctx, uint64_t stream_id);
/* ... */
} http3_methods_t;
  • on_conn_goaway is called when a GOAWAY frame is received from the peer. This callback is optional, and after receiving this event, the upper-layer application should not initiate new streams on the connection.

Miscellaneous functions​

http3_for_each_setting​

int http3_for_each_setting(const struct http3_conn_t *conn, int (*cb)(uint64_t identifier,
uint64_t value,
void *argp), void *argp);
  • For each settings parameter, execute the cb callback.

http3_send_goaway​

int64_t http3_send_goaway(struct http3_conn_t *conn, struct quic_conn_t *quic_conn, uint64_t id);
  • Send a GOAWAY frame to the peer and disconnect gracefully.

HTTP/3 request​

Request and Response​

http3_stream_new​

int64_t http3_stream_new(struct http3_conn_t *conn, struct quic_conn_t *quic_conn);
  • Create a new HTTP/3 request stream.

http3_stream_new_with_priority​

int64_t http3_stream_new_with_priority(struct http3_conn_t *conn,
struct quic_conn_t *quic_conn,
const struct http3_priority_t *priority);
  • Create a new HTTP/3 request stream with a specified priority using the priority parameter.

http3_stream_close​

int http3_stream_close(struct http3_conn_t *conn,
struct quic_conn_t *quic_conn,
uint64_t stream_id);
  • Close HTTP/3 request stream.

http3_send_headers​

int http3_send_headers(struct http3_conn_t *conn,
struct quic_conn_t *quic_conn,
uint64_t stream_id,
const struct http3_header_t *headers,
size_t headers_len,
bool fin);
  • Send HTTP/3 request or response headers, where the fin indicates whether there is more data to be sent.

http3_send_body​

ssize_t http3_send_body(struct http3_conn_t *conn,
struct quic_conn_t *quic_conn,
uint64_t stream_id,
const uint8_t *body,
size_t body_len,
bool fin);
  • Send body for an HTTP/3 request or response, where the fin indicates whether there is more data to be sent.

http3_recv_body​

ssize_t http3_recv_body(struct http3_conn_t *conn,
struct quic_conn_t *quic_conn,
uint64_t stream_id,
uint8_t *out,
size_t out_len);
  • Receive body for an HTTP/3 request or response.

http3_for_each_header​

int http3_for_each_header(const struct http3_headers_t *headers, int (*cb)(const uint8_t *name,
size_t name_len,
const uint8_t *value,
size_t value_len,
void *argp), void *argp);
  • For each header, execute the cb callback.

http3_stream_read_finished​

bool http3_stream_read_finished(struct quic_conn_t *conn, uint64_t stream_id);
  • Check if all incoming data has been fully read.

HTTP/3 Extensiable priority​

http3_stream_set_priority​

int http3_stream_set_priority(struct http3_conn_t *conn,
struct quic_conn_t *quic_conn,
uint64_t stream_id,
const struct http3_priority_t *priority);
  • Set priority for an HTTP/3 stream.

http3_send_priority_update_for_request​

int http3_send_priority_update_for_request(struct http3_conn_t *conn,
struct quic_conn_t *quic_conn,
uint64_t stream_id,
const struct http3_priority_t *priority);
  • HTTP/3 client sends a PRIORITY_UPDATE frame for the given request stream to the server.

http3_take_priority_update​

int http3_take_priority_update(struct http3_conn_t *conn,
uint64_t prioritized_element_id,
int (*cb)(const uint8_t *priority_field_value,
size_t priority_field_value_len,
void *argp),
void *argp);
  • When the application got a priority update event, it can use this api to get the priority_field value for the prioritized_element_id stream.

http3_parse_extensible_priority​

int http3_parse_extensible_priority(const uint8_t *priority,
size_t priority_len,
struct http3_priority_t *parsed);
  • The application uses this api to parse the structured encoded priority_field into the http3_priority_t structure.

Miscellaneous functions​

http3_methods_t​

typedef struct http3_methods_t {
/**
* Called when the stream got headers.
*/
void (*on_stream_headers)(void *ctx,
uint64_t stream_id,
const struct http3_headers_t *headers,
bool fin);
/**
* Called when the stream has buffered data to read.
*/
void (*on_stream_data)(void *ctx, uint64_t stream_id);
/**
* Called when the stream is finished.
*/
void (*on_stream_finished)(void *ctx, uint64_t stream_id);
/**
* Called when the stream receives a RESET_STREAM frame from the peer.
*/
void (*on_stream_reset)(void *ctx, uint64_t stream_id, uint64_t error_code);
/**
* Called when the stream priority is updated.
*/
void (*on_stream_priority_update)(void *ctx, uint64_t stream_id);
/**
* Called when the connection receives a GOAWAY frame from the peer.
*/
void (*on_conn_goaway)(void *ctx, uint64_t stream_id);
} http3_methods_t;
  • HTTP/3 callbacks.

http3_context_t​

typedef void *http3_context_t;
  • HTTP/3 context.

http3_header_t​

typedef struct http3_header_t {
uint8_t *name;
uintptr_t name_len;
uint8_t *value;
uintptr_t value_len;
} http3_header_t;
  • HTTP/3 header structure.

http3_headers_t​

typedef struct http3_headers_t http3_headers_t;
  • HTTP/3 headers list.

http3_priority_t​

typedef struct http3_priority_t {
uint8_t urgency;
bool incremental;
} http3_priority_t;
  • HTTP/3 stream priority.