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
cand 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
#include <src/microserve/http3_quic.cppm>
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*)
#include <src/microserve/http3_conn.cppm>
static int microserve:: http3_detail:: h3_end_headers(nghttp3_conn*,
const int64_t stream_id,
const int fin,
void* user_data,
void*)
#include <src/microserve/http3_conn.cppm>
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*)
#include <src/microserve/http3_conn.cppm>
static int microserve:: http3_detail:: h3_end_stream(nghttp3_conn*,
const int64_t stream_id,
void* user_data,
void*)
#include <src/microserve/http3_conn.cppm>
static int microserve:: http3_detail:: h3_acked_stream_data(nghttp3_conn*,
int64_t,
uint64_t,
void*,
void*)
#include <src/microserve/http3_conn.cppm>
static int microserve:: http3_detail:: h3_stream_close(nghttp3_conn*,
const int64_t stream_id,
uint64_t,
void* user_data,
void*)
#include <src/microserve/http3_conn.cppm>
static int microserve:: http3_detail:: h3_deferred_consume(nghttp3_conn*,
const int64_t stream_id,
const size_t num_consumed,
void* user_data,
void*)
#include <src/microserve/http3_conn.cppm>
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)
#include <src/microserve/http3_conn.cppm>
std::unique_ptr<QuicApp> microserve:: http3_detail:: make_h3_session(QuicTransport& qt,
Handler* handler)
#include <src/microserve/http3_conn.cppm>
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()
#include <src/microserve/http3_quic.cppm>
static ngtcp2_cid microserve:: http3_detail:: make_cid(const uint8_t* data,
const size_t len)
#include <src/microserve/http3_quic.cppm>
static void microserve:: http3_detail:: fill_crypto_callbacks(ngtcp2_callbacks& cb)
#include <src/microserve/http3_quic.cppm>
Wire ngtcp2_crypto AEAD / HP / key-update hooks into cb.
static int microserve:: http3_detail:: configure_server_ssl_ctx(SSL_CTX* ctx)
#include <src/microserve/http3_quic.cppm>
static int microserve:: http3_detail:: configure_server_ssl_session(SSL* ssl)
#include <src/microserve/http3_quic.cppm>
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*)
#include <src/microserve/http3_quic.cppm>
ALPN select: require "h3".
static std::string microserve:: http3_detail:: cid_key(const ngtcp2_cid& cid)
#include <src/microserve/http3_quic.cppm>
static ngtcp2_tstamp microserve:: http3_detail:: timestamp()
#include <src/microserve/http3_quic.cppm>
static void microserve:: http3_detail:: remove_connection(const std::shared_ptr<QuicConnection>& c)
#include <src/microserve/http3_quic.cppm>
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)
#include <src/microserve/http3_quic.cppm>
static void microserve:: http3_detail:: flush_connection(const std::shared_ptr<QuicConnection>& c)
#include <src/microserve/http3_quic.cppm>
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)
#include <src/microserve/http3_quic.cppm>
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)
#include <src/microserve/http3_quic.cppm>
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)
#include <src/microserve/http3_quic.cppm>
static void microserve:: http3_detail:: free_ssl_ctx(SSL_CTX*& ctx)
#include <src/microserve/http3_quic.cppm>
void microserve:: http3_detail:: handle_packet(const ConnOwner& owner,
const uint8_t* data,
size_t n,
const udp::endpoint& remote)
#include <src/microserve/http3_quic.cppm>
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)
#include <src/microserve/http3_quic.cppm>
static int microserve:: http3_detail:: app_fail(const int rv)
#include <src/microserve/http3_quic.cppm>
static int microserve:: http3_detail:: cb_handshake_completed(ngtcp2_conn*,
void* user_data)
#include <src/microserve/http3_quic.cppm>
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*)
#include <src/microserve/http3_quic.cppm>
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)
#include <src/microserve/http3_quic.cppm>
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*)
#include <src/microserve/http3_quic.cppm>
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*)
#include <src/microserve/http3_quic.cppm>
static int microserve:: http3_detail:: cb_extend_max_remote_streams_bidi(ngtcp2_conn*,
const uint64_t max_streams,
void* user_data)
#include <src/microserve/http3_quic.cppm>
static int microserve:: http3_detail:: cb_extend_max_local_streams_bidi(ngtcp2_conn*,
uint64_t,
void*)
#include <src/microserve/http3_quic.cppm>
static int microserve:: http3_detail:: cb_extend_max_stream_data(ngtcp2_conn*,
const int64_t stream_id,
uint64_t,
void* user_data,
void*)
#include <src/microserve/http3_quic.cppm>
static void microserve:: http3_detail:: cb_rand(uint8_t* dest,
const size_t dest_len,
const ngtcp2_rand_ctx*)
#include <src/microserve/http3_quic.cppm>
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)
#include <src/microserve/http3_quic.cppm>
static int microserve:: http3_detail:: cb_remove_connection_id(ngtcp2_conn*,
const ngtcp2_cid* cid,
void* user_data)
#include <src/microserve/http3_quic.cppm>
static int microserve:: http3_detail:: cb_stream_reset(ngtcp2_conn*,
const int64_t stream_id,
uint64_t,
uint64_t,
void* user_data,
void*)
#include <src/microserve/http3_quic.cppm>
static int microserve:: http3_detail:: cb_path_validation(ngtcp2_conn*,
uint32_t,
const ngtcp2_path*,
const ngtcp2_path*,
ngtcp2_path_validation_result,
void*)
#include <src/microserve/http3_quic.cppm>
std::unique_ptr<ServerTls> microserve:: http3_detail:: make_server_tls(const std::string& cert_file,
const std::string& key_file)
#include <src/microserve/http3_quic.cppm>
Variable documentation
size_t microserve:: http3_detail:: kCidLen constexpr
#include <src/microserve/http3_quic.cppm>
size_t microserve:: http3_detail:: kMaxUdpPayload constexpr
#include <src/microserve/http3_quic.cppm>
size_t microserve:: http3_detail:: kUdpBufSize constexpr
#include <src/microserve/http3_quic.cppm>