microserve::http3_detail namespace

HTTP/3 application session (nghttp3) for one QUIC connection.

Implements QuicApp. Does not touch UDP, CIDs, or SSL_CTX.

Classes

struct BodyHolder
Response body whose lifetime is tied to the HTTP/3 stream.
struct StreamState
Per-request HTTP state on a client-initiated bidirectional stream.
struct H3Session
HTTP/3 session on top of one QUIC connection.
struct QuicVec
STREAM byte view; layout matches ngtcp2_vec / nghttp3_vec.
struct QuicTransport
QUIC operations the HTTP/3 session may call.
struct QuicApp
Application sitting on a QUIC connection (HTTP/3 session).
struct ConnOwner
Non-owning back-refs to the UDP listener.
struct QuicConnection
One QUIC connection (ngtcp2 + TLS).
struct ServerTls
Owns the process-wide (per-listener) SSL_CTX so the primary never names OpenSSL.

Typedefs

using Connection = QuicConnection

Functions

static auto h3_recv_header(nghttp3_conn*, const int64_t stream_id, int32_t, nghttp3_rcbuf* name, nghttp3_rcbuf* value, uint8_t, void* user_data, void*) -> int
static auto h3_end_headers(nghttp3_conn*, const int64_t stream_id, const int fin, void* user_data, void*) -> int
static auto h3_recv_data(nghttp3_conn*, const int64_t stream_id, const uint8_t* data, const size_t data_len, void* user_data, void*) -> int
static auto h3_end_stream(nghttp3_conn*, const int64_t stream_id, void* user_data, void*) -> int
static auto h3_acked_stream_data(nghttp3_conn*, int64_t, uint64_t, void*, void*) -> int
static auto h3_stream_close(nghttp3_conn*, const int64_t stream_id, uint64_t, void* user_data, void*) -> int
static auto h3_deferred_consume(nghttp3_conn*, const int64_t stream_id, const size_t num_consumed, void* user_data, void*) -> int
static auto body_read_cb(nghttp3_conn*, int64_t, nghttp3_vec* vec, const size_t vec_count, uint32_t* p_flags, void*, void* stream_user_data) -> nghttp3_ssize
auto make_h3_session(QuicTransport& qt, Handler* handler) -> std::unique_ptr<QuicApp>
Construct an HTTP/3 session as a QuicApp.
static auto random_cid() -> std::array<uint8_t, kCidLen>
static auto make_cid(const uint8_t* data, const size_t len) -> ngtcp2_cid
static void fill_crypto_callbacks(ngtcp2_callbacks& cb)
Wire ngtcp2_crypto AEAD / HP / key-update hooks into cb.
static auto configure_server_ssl_ctx(SSL_CTX* ctx) -> int
static auto configure_server_ssl_session(SSL* ssl) -> int
static auto alpn_select_cb(SSL*, const unsigned char** out, unsigned char* out_len, const unsigned char* in, const unsigned int in_len, void*) -> int
ALPN select: require "h3".
static auto cid_key(const ngtcp2_cid& cid) -> std::string
static auto timestamp() -> ngtcp2_tstamp
static void remove_connection(const std::shared_ptr<QuicConnection>& c)
Drop all CID map entries for c and cancel its timer.
static void close_connection(const std::shared_ptr<QuicConnection>& c, uint64_t)
static void flush_connection(const std::shared_ptr<QuicConnection>& c)
Drain application STREAM writes, then pure QUIC packets (ACK/crypto).
static auto setup_conn_tls(QuicConnection& c) -> bool
Per-connection SSL + ngtcp2_crypto native handle.
static auto create_connection(ConnOwner owner, const ngtcp2_pkt_hd& hd, const udp::endpoint& remote) -> std::shared_ptr<QuicConnection>
Accept a Client Initial: allocate SCID, transport params, TLS, map entry.
static auto create_ssl_ctx(const std::string& cert_file, const std::string& key_file) -> SSL_CTX*
static void free_ssl_ctx(SSL_CTX*& ctx)
void handle_packet(const ConnOwner& owner, const uint8_t* data, size_t n, const udp::endpoint& remote)
Demux by DCID → existing conn, or ngtcp2_accept → new conn.
static void send_packet(QuicConnection& c, const udp::endpoint& ep, const uint8_t* data, const size_t len)
static auto app_fail(const int rv) -> int
static auto cb_handshake_completed(ngtcp2_conn*, void* user_data) -> int
static auto cb_recv_stream_data(ngtcp2_conn* conn, const uint32_t flags, const int64_t stream_id, uint64_t, const uint8_t* data, const size_t data_len, void* user_data, void*) -> int
Deliver STREAM payload to the app (HTTP/3), which may buffer until ready.
static auto cb_stream_open(ngtcp2_conn*, const int64_t stream_id, void* user_data) -> int
static auto cb_stream_close(ngtcp2_conn*, const uint32_t flags, const int64_t stream_id, const uint64_t app_error_code, void* user_data, void*) -> int
static auto cb_acked_stream_data_offset(ngtcp2_conn*, const int64_t stream_id, uint64_t, const uint64_t data_len, void* user_data, void*) -> int
static auto cb_extend_max_remote_streams_bidi(ngtcp2_conn*, const uint64_t max_streams, void* user_data) -> int
static auto cb_extend_max_local_streams_bidi(ngtcp2_conn*, uint64_t, void*) -> int
static auto cb_extend_max_stream_data(ngtcp2_conn*, const int64_t stream_id, uint64_t, void* user_data, void*) -> int
static void cb_rand(uint8_t* dest, const size_t dest_len, const ngtcp2_rand_ctx*)
static auto cb_get_new_connection_id(ngtcp2_conn*, ngtcp2_cid* cid, uint8_t* token, size_t cid_len, void* user_data) -> int
static auto cb_remove_connection_id(ngtcp2_conn*, const ngtcp2_cid* cid, void* user_data) -> int
static auto cb_stream_reset(ngtcp2_conn*, const int64_t stream_id, uint64_t, uint64_t, void* user_data, void*) -> int
static auto cb_path_validation(ngtcp2_conn*, uint32_t, const ngtcp2_path*, const ngtcp2_path*, ngtcp2_path_validation_result, void*) -> int
auto make_server_tls(const std::string& cert_file, const std::string& key_file) -> std::unique_ptr<ServerTls>

Variables

size_t kCidLen constexpr
size_t kMaxUdpPayload constexpr
size_t kUdpBufSize constexpr

Typedef documentation

using microserve::http3_detail::Connection = QuicConnection

Function documentation

static int microserve::http3_detail::h3_recv_header(nghttp3_conn*, const int64_t stream_id, int32_t, nghttp3_rcbuf* name, nghttp3_rcbuf* value, uint8_t, void* user_data, void*)

static int microserve::http3_detail::h3_end_headers(nghttp3_conn*, const int64_t stream_id, const int fin, void* user_data, void*)

static int microserve::http3_detail::h3_recv_data(nghttp3_conn*, const int64_t stream_id, const uint8_t* data, const size_t data_len, void* user_data, void*)

static int microserve::http3_detail::h3_end_stream(nghttp3_conn*, const int64_t stream_id, void* user_data, void*)

static int microserve::http3_detail::h3_acked_stream_data(nghttp3_conn*, int64_t, uint64_t, void*, void*)

static int microserve::http3_detail::h3_stream_close(nghttp3_conn*, const int64_t stream_id, uint64_t, void* user_data, void*)

static int microserve::http3_detail::h3_deferred_consume(nghttp3_conn*, const int64_t stream_id, const size_t num_consumed, void* user_data, void*)

static nghttp3_ssize microserve::http3_detail::body_read_cb(nghttp3_conn*, int64_t, nghttp3_vec* vec, const size_t vec_count, uint32_t* p_flags, void*, void* stream_user_data)

std::unique_ptr<QuicApp> microserve::http3_detail::make_h3_session(QuicTransport& qt, Handler* handler)

Construct an HTTP/3 session as a QuicApp.

Parameters
qt QUIC transport for the owning connection.
handler Request handler (non-owning).
Returns New session implementing QuicApp.

static std::array<uint8_t, kCidLen> microserve::http3_detail::random_cid()

static ngtcp2_cid microserve::http3_detail::make_cid(const uint8_t* data, const size_t len)

static void microserve::http3_detail::fill_crypto_callbacks(ngtcp2_callbacks& cb)

Wire ngtcp2_crypto AEAD / HP / key-update hooks into cb.

static int microserve::http3_detail::configure_server_ssl_ctx(SSL_CTX* ctx)

static int microserve::http3_detail::configure_server_ssl_session(SSL* ssl)

static int microserve::http3_detail::alpn_select_cb(SSL*, const unsigned char** out, unsigned char* out_len, const unsigned char* in, const unsigned int in_len, void*)

ALPN select: require "h3".

static std::string microserve::http3_detail::cid_key(const ngtcp2_cid& cid)

static ngtcp2_tstamp microserve::http3_detail::timestamp()

static void microserve::http3_detail::remove_connection(const std::shared_ptr<QuicConnection>& c)

Drop all CID map entries for c and cancel its timer.

static void microserve::http3_detail::close_connection(const std::shared_ptr<QuicConnection>& c, uint64_t)

static void microserve::http3_detail::flush_connection(const std::shared_ptr<QuicConnection>& c)

Drain application STREAM writes, then pure QUIC packets (ACK/crypto).

Coupling rules:

  • NGTCP2_ERR_WRITE_MORE / successful write: add_write_offset only if ndatalen > 0
  • DATA_BLOCKED → block_stream; SHUT_WR → shutdown_stream_write
  • Never shutdown_stream_write just because fin && no body (header-only OK)
  • nwrite == 0 → update_pkt_tx_time and stop (pacing/congestion)

static bool microserve::http3_detail::setup_conn_tls(QuicConnection& c)

Per-connection SSL + ngtcp2_crypto native handle.

static std::shared_ptr<QuicConnection> microserve::http3_detail::create_connection(ConnOwner owner, const ngtcp2_pkt_hd& hd, const udp::endpoint& remote)

Accept a Client Initial: allocate SCID, transport params, TLS, map entry.

Parameters
owner listener back-refs
hd decoded packet header from ngtcp2_accept
remote

static SSL_CTX* microserve::http3_detail::create_ssl_ctx(const std::string& cert_file, const std::string& key_file)

static void microserve::http3_detail::free_ssl_ctx(SSL_CTX*& ctx)

void microserve::http3_detail::handle_packet(const ConnOwner& owner, const uint8_t* data, size_t n, const udp::endpoint& remote)

Demux by DCID → existing conn, or ngtcp2_accept → new conn.

On success: read_pkt then flush_connection.

static void microserve::http3_detail::send_packet(QuicConnection& c, const udp::endpoint& ep, const uint8_t* data, const size_t len)

static int microserve::http3_detail::app_fail(const int rv)

static int microserve::http3_detail::cb_handshake_completed(ngtcp2_conn*, void* user_data)

static int microserve::http3_detail::cb_recv_stream_data(ngtcp2_conn* conn, const uint32_t flags, const int64_t stream_id, uint64_t, const uint8_t* data, const size_t data_len, void* user_data, void*)

Deliver STREAM payload to the app (HTTP/3), which may buffer until ready.

Flow control is extended only after the app reports consumed bytes.

static int microserve::http3_detail::cb_stream_open(ngtcp2_conn*, const int64_t stream_id, void* user_data)

static int microserve::http3_detail::cb_stream_close(ngtcp2_conn*, const uint32_t flags, const int64_t stream_id, const uint64_t app_error_code, void* user_data, void*)

static int microserve::http3_detail::cb_acked_stream_data_offset(ngtcp2_conn*, const int64_t stream_id, uint64_t, const uint64_t data_len, void* user_data, void*)

static int microserve::http3_detail::cb_extend_max_remote_streams_bidi(ngtcp2_conn*, const uint64_t max_streams, void* user_data)

static int microserve::http3_detail::cb_extend_max_local_streams_bidi(ngtcp2_conn*, uint64_t, void*)

static int microserve::http3_detail::cb_extend_max_stream_data(ngtcp2_conn*, const int64_t stream_id, uint64_t, void* user_data, void*)

static void microserve::http3_detail::cb_rand(uint8_t* dest, const size_t dest_len, const ngtcp2_rand_ctx*)

static int microserve::http3_detail::cb_get_new_connection_id(ngtcp2_conn*, ngtcp2_cid* cid, uint8_t* token, size_t cid_len, void* user_data)

static int microserve::http3_detail::cb_remove_connection_id(ngtcp2_conn*, const ngtcp2_cid* cid, void* user_data)

static int microserve::http3_detail::cb_stream_reset(ngtcp2_conn*, const int64_t stream_id, uint64_t, uint64_t, void* user_data, void*)

static int microserve::http3_detail::cb_path_validation(ngtcp2_conn*, uint32_t, const ngtcp2_path*, const ngtcp2_path*, ngtcp2_path_validation_result, void*)

std::unique_ptr<ServerTls> microserve::http3_detail::make_server_tls(const std::string& cert_file, const std::string& key_file)

Variable documentation

size_t microserve::http3_detail::kCidLen constexpr

size_t microserve::http3_detail::kMaxUdpPayload constexpr

size_t microserve::http3_detail::kUdpBufSize constexpr