Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
kcenon::network::protocols::http2::http2_server Class Reference

HTTP/2 server with TLS support. More...

#include <http2_server.h>

Inheritance diagram for kcenon::network::protocols::http2::http2_server:
Inheritance graph
Collaboration diagram for kcenon::network::protocols::http2::http2_server:
Collaboration graph

Public Types

using request_handler_t
 Request handler function type.
 
using error_handler_t
 Error handler function type.
 

Public Member Functions

 http2_server (std::string_view server_id)
 Construct HTTP/2 server.
 
 ~http2_server ()
 Destructor - stops server gracefully.
 
 http2_server (const http2_server &)=delete
 
http2_serveroperator= (const http2_server &)=delete
 
 http2_server (http2_server &&)=delete
 
http2_serveroperator= (http2_server &&)=delete
 
auto start (unsigned short port) -> VoidResult
 Start HTTP/2 server without TLS (h2c - HTTP/2 cleartext)
 
auto start_tls (unsigned short port, const tls_config &config) -> VoidResult
 Start HTTP/2 server with TLS.
 
auto stop () -> VoidResult
 Stop the server.
 
auto is_running () const -> bool
 Check if server is running.
 
auto wait () -> void
 Wait for server to stop.
 
auto set_request_handler (request_handler_t handler) -> void
 Set request handler.
 
auto set_error_handler (error_handler_t handler) -> void
 Set error handler.
 
auto set_settings (const http2_settings &settings) -> void
 Set server settings.
 
auto get_settings () const -> http2_settings
 Get current settings.
 
auto active_connections () const -> size_t
 Get number of active connections.
 
auto active_streams () const -> size_t
 Get total number of active streams across all connections.
 
auto server_id () const -> std::string_view
 Get server identifier.
 

Private Member Functions

auto do_accept () -> void
 
auto do_accept_tls () -> void
 
auto handle_accept (std::error_code ec, asio::ip::tcp::socket socket) -> void
 
auto handle_accept_tls (std::error_code ec, asio::ip::tcp::socket socket) -> void
 
auto add_connection (std::shared_ptr< http2_server_connection > conn) -> void
 
auto remove_connection (uint64_t connection_id) -> void
 
auto cleanup_dead_connections () -> void
 
auto start_cleanup_timer () -> void
 
auto run_io () -> void
 
auto stop_io () -> void
 

Private Attributes

std::string server_id_
 Server identifier.
 
std::unique_ptr< asio::io_context > io_context_
 
std::unique_ptr< asio::ssl::context > ssl_context_
 
std::unique_ptr< asio::ip::tcp::acceptor > acceptor_
 
std::unique_ptr< asio::executor_work_guard< asio::io_context::executor_type > > work_guard_
 
std::future< void > io_future_
 
std::atomic< bool > is_running_ {false}
 
std::atomic< bool > use_tls_ {false}
 
std::promise< void > stop_promise_
 
std::future< void > stop_future_
 
request_handler_t request_handler_
 
error_handler_t error_handler_
 
std::mutex connections_mutex_
 
std::map< uint64_t, std::shared_ptr< http2_server_connection > > connections_
 
std::atomic< uint64_t > next_connection_id_ {1}
 
http2_settings settings_
 
std::shared_ptr< hpack_encoderencoder_
 
std::shared_ptr< hpack_decoderdecoder_
 
std::unique_ptr< asio::steady_timer > cleanup_timer_
 

Static Private Attributes

static constexpr std::string_view CONNECTION_PREFACE
 
static constexpr size_t FRAME_HEADER_SIZE = 9
 

Detailed Description

HTTP/2 server with TLS support.

Thread Safety

  • All public methods are thread-safe
  • Request handler is called from I/O thread
  • Multiple connections handled concurrently

Features

  • HTTP/2 protocol support (RFC 7540)
  • HPACK header compression (RFC 7541)
  • TLS 1.3 with ALPN "h2" negotiation
  • Stream multiplexing
  • Flow control
  • Connection-level and stream-level flow control

Usage Example

auto server = std::make_shared<http2_server>("my-server");
server->set_request_handler([](http2_server_stream& stream,
const http2_request& request) {
if (request.method == "GET" && request.path == "/api/health") {
stream.send_headers(200, {{"content-type", "application/json"}});
stream.send_data(R"({"status": "ok"})", true);
} else {
stream.send_headers(404, {});
stream.send_data("Not Found", true);
}
});
// Start with TLS
tls_config config;
config.cert_file = "/path/to/cert.pem";
config.key_file = "/path/to/key.pem";
server->start_tls(8443, config);
// Wait for shutdown signal
server->wait();
// Stop server
server->stop();
Server-side HTTP/2 stream for sending responses.
auto send_headers(int status_code, const std::vector< http_header > &headers, bool end_stream=false) -> VoidResult
Send response headers.
auto send_data(const std::vector< uint8_t > &data, bool end_stream=false) -> VoidResult
Send response data.
tracing_config config
Definition exporters.cpp:29
@ server
Server-side handling of a request.
std::string path
Request path (:path pseudo-header)
std::string method
HTTP method (:method pseudo-header)

Definition at line 92 of file http2_server.h.

Member Typedef Documentation

◆ error_handler_t

Initial value:
std::function<void(
const std::string& error_message)>

Error handler function type.

Definition at line 101 of file http2_server.h.

◆ request_handler_t

Initial value:
std::function<void(
http2_server_stream& stream,
const http2_request& request)>

Request handler function type.

Definition at line 96 of file http2_server.h.

Constructor & Destructor Documentation

◆ http2_server() [1/3]

kcenon::network::protocols::http2::http2_server::http2_server ( std::string_view server_id)
explicit

Construct HTTP/2 server.

Parameters
server_idUnique server identifier for logging

Definition at line 16 of file http2_server.cpp.

18 , stop_future_(stop_promise_.get_future())
19 , encoder_(std::make_shared<hpack_encoder>(settings_.header_table_size))
20 , decoder_(std::make_shared<hpack_decoder>(settings_.header_table_size))
21 {
22 }
auto server_id() const -> std::string_view
Get server identifier.
std::shared_ptr< hpack_encoder > encoder_
std::shared_ptr< hpack_decoder > decoder_
uint32_t header_table_size
HPACK dynamic table size.

◆ ~http2_server()

kcenon::network::protocols::http2::http2_server::~http2_server ( )

Destructor - stops server gracefully.

Definition at line 24 of file http2_server.cpp.

25 {
26 if (is_running_) {
27 stop();
28 }
29 }
auto stop() -> VoidResult
Stop the server.

References is_running_, and stop().

Here is the call graph for this function:

◆ http2_server() [2/3]

kcenon::network::protocols::http2::http2_server::http2_server ( const http2_server & )
delete

◆ http2_server() [3/3]

kcenon::network::protocols::http2::http2_server::http2_server ( http2_server && )
delete

Member Function Documentation

◆ active_connections()

auto kcenon::network::protocols::http2::http2_server::active_connections ( ) const -> size_t
nodiscard

Get number of active connections.

Returns
Active connection count

Definition at line 219 of file http2_server.cpp.

220 {
221 std::lock_guard<std::mutex> lock(const_cast<std::mutex&>(connections_mutex_));
222 return connections_.size();
223 }
std::map< uint64_t, std::shared_ptr< http2_server_connection > > connections_

◆ active_streams()

auto kcenon::network::protocols::http2::http2_server::active_streams ( ) const -> size_t
nodiscard

Get total number of active streams across all connections.

Returns
Active stream count

Definition at line 225 of file http2_server.cpp.

226 {
227 std::lock_guard<std::mutex> lock(const_cast<std::mutex&>(connections_mutex_));
228 size_t total = 0;
229 for (const auto& [id, conn] : connections_) {
230 total += conn->stream_count();
231 }
232 return total;
233 }

◆ add_connection()

auto kcenon::network::protocols::http2::http2_server::add_connection ( std::shared_ptr< http2_server_connection > conn) -> void
private

Definition at line 334 of file http2_server.cpp.

335 {
336 std::lock_guard<std::mutex> lock(connections_mutex_);
337 connections_[conn->connection_id()] = std::move(conn);
338 }

◆ cleanup_dead_connections()

auto kcenon::network::protocols::http2::http2_server::cleanup_dead_connections ( ) -> void
private

Definition at line 346 of file http2_server.cpp.

347 {
348 std::lock_guard<std::mutex> lock(connections_mutex_);
349 for (auto it = connections_.begin(); it != connections_.end();) {
350 if (!it->second->is_alive()) {
351 it = connections_.erase(it);
352 } else {
353 ++it;
354 }
355 }
356 }

◆ do_accept()

auto kcenon::network::protocols::http2::http2_server::do_accept ( ) -> void
private

Definition at line 240 of file http2_server.cpp.

241 {
242 if (!is_running_ || !acceptor_) {
243 return;
244 }
245
246 acceptor_->async_accept(
247 [this](std::error_code ec, asio::ip::tcp::socket socket) {
248 handle_accept(ec, std::move(socket));
249 });
250 }
auto handle_accept(std::error_code ec, asio::ip::tcp::socket socket) -> void
std::unique_ptr< asio::ip::tcp::acceptor > acceptor_

◆ do_accept_tls()

auto kcenon::network::protocols::http2::http2_server::do_accept_tls ( ) -> void
private

Definition at line 252 of file http2_server.cpp.

253 {
254 if (!is_running_ || !acceptor_) {
255 return;
256 }
257
258 acceptor_->async_accept(
259 [this](std::error_code ec, asio::ip::tcp::socket socket) {
260 handle_accept_tls(ec, std::move(socket));
261 });
262 }
auto handle_accept_tls(std::error_code ec, asio::ip::tcp::socket socket) -> void

◆ get_settings()

auto kcenon::network::protocols::http2::http2_server::get_settings ( ) const -> http2_settings
nodiscard

Get current settings.

Returns
Current HTTP/2 settings

Definition at line 214 of file http2_server.cpp.

215 {
216 return settings_;
217 }

◆ handle_accept()

auto kcenon::network::protocols::http2::http2_server::handle_accept ( std::error_code ec,
asio::ip::tcp::socket socket ) -> void
private

Definition at line 264 of file http2_server.cpp.

265 {
266 if (!is_running_) {
267 return;
268 }
269
270 if (ec) {
271 if (error_handler_) {
272 error_handler_(std::string("Accept error: ") + ec.message());
273 }
274 } else {
275 uint64_t conn_id = next_connection_id_++;
276 auto conn = std::make_shared<http2_server_connection>(
277 conn_id,
278 std::move(socket),
279 settings_,
282
283 add_connection(conn);
284 conn->start();
285 }
286
287 // Continue accepting
288 do_accept();
289 }
auto add_connection(std::shared_ptr< http2_server_connection > conn) -> void

◆ handle_accept_tls()

auto kcenon::network::protocols::http2::http2_server::handle_accept_tls ( std::error_code ec,
asio::ip::tcp::socket socket ) -> void
private

Definition at line 291 of file http2_server.cpp.

292 {
293 if (!is_running_) {
294 return;
295 }
296
297 if (ec) {
298 if (error_handler_) {
299 error_handler_(std::string("Accept error: ") + ec.message());
300 }
302 return;
303 }
304
305 auto tls_socket = std::make_unique<asio::ssl::stream<asio::ip::tcp::socket>>(
306 std::move(socket), *ssl_context_);
307
308 auto* raw_socket = tls_socket.get();
309 raw_socket->async_handshake(
310 asio::ssl::stream_base::server,
311 [this, tls_socket = std::move(tls_socket)](std::error_code ec) mutable {
312 if (ec) {
313 if (error_handler_) {
314 error_handler_(std::string("TLS handshake error: ") + ec.message());
315 }
316 } else {
317 uint64_t conn_id = next_connection_id_++;
318 auto conn = std::make_shared<http2_server_connection>(
319 conn_id,
320 std::move(tls_socket),
321 settings_,
324
325 add_connection(conn);
326 conn->start();
327 }
328
329 // Continue accepting
331 });
332 }
std::unique_ptr< asio::ssl::context > ssl_context_

◆ is_running()

auto kcenon::network::protocols::http2::http2_server::is_running ( ) const -> bool
nodiscard

Check if server is running.

Returns
True if server is accepting connections

Definition at line 187 of file http2_server.cpp.

188 {
189 return is_running_;
190 }

◆ operator=() [1/2]

http2_server & kcenon::network::protocols::http2::http2_server::operator= ( const http2_server & )
delete

◆ operator=() [2/2]

http2_server & kcenon::network::protocols::http2::http2_server::operator= ( http2_server && )
delete

◆ remove_connection()

auto kcenon::network::protocols::http2::http2_server::remove_connection ( uint64_t connection_id) -> void
private

Definition at line 340 of file http2_server.cpp.

341 {
342 std::lock_guard<std::mutex> lock(connections_mutex_);
343 connections_.erase(connection_id);
344 }

◆ run_io()

auto kcenon::network::protocols::http2::http2_server::run_io ( ) -> void
private

Definition at line 374 of file http2_server.cpp.

375 {
376 if (io_context_) {
377 io_context_->run();
378 }
379 }
std::unique_ptr< asio::io_context > io_context_

◆ server_id()

auto kcenon::network::protocols::http2::http2_server::server_id ( ) const -> std::string_view
nodiscard

Get server identifier.

Returns
Server ID string

Definition at line 235 of file http2_server.cpp.

236 {
237 return server_id_;
238 }

◆ set_error_handler()

auto kcenon::network::protocols::http2::http2_server::set_error_handler ( error_handler_t handler) -> void

Set error handler.

Parameters
handlerFunction to handle errors

Definition at line 202 of file http2_server.cpp.

203 {
204 error_handler_ = std::move(handler);
205 }

◆ set_request_handler()

auto kcenon::network::protocols::http2::http2_server::set_request_handler ( request_handler_t handler) -> void

Set request handler.

Parameters
handlerFunction to handle incoming requests

The handler is called for each complete HTTP/2 request. Handler should not block for long periods.

Definition at line 197 of file http2_server.cpp.

198 {
199 request_handler_ = std::move(handler);
200 }

◆ set_settings()

auto kcenon::network::protocols::http2::http2_server::set_settings ( const http2_settings & settings) -> void

Set server settings.

Parameters
settingsHTTP/2 settings to use

Definition at line 207 of file http2_server.cpp.

208 {
210 encoder_->set_max_table_size(settings.header_table_size);
211 decoder_->set_max_table_size(settings.header_table_size);
212 }

References kcenon::network::protocols::http2::settings.

◆ start()

auto kcenon::network::protocols::http2::http2_server::start ( unsigned short port) -> VoidResult

Start HTTP/2 server without TLS (h2c - HTTP/2 cleartext)

Parameters
portPort to listen on
Returns
Success or error
Note
h2c is not widely supported. Prefer start_tls() for production.

Definition at line 31 of file http2_server.cpp.

32 {
33 if (is_running_) {
34 return error_void(
36 "Server already running",
37 "http2_server");
38 }
39
40 try {
41 io_context_ = std::make_unique<asio::io_context>();
42 work_guard_ = std::make_unique<asio::executor_work_guard<asio::io_context::executor_type>>(
43 io_context_->get_executor());
44
45 acceptor_ = std::make_unique<asio::ip::tcp::acceptor>(
47 asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port));
48
49 use_tls_ = false;
50 is_running_ = true;
51
52 // Start I/O thread
53 io_future_ = std::async(std::launch::async, [this]() { run_io(); });
54
55 // Start accepting connections
56 do_accept();
58
59 return ok();
60 } catch (const std::exception& e) {
61 return error_void(
63 std::string("Failed to start server: ") + e.what(),
64 "http2_server");
65 }
66 }
std::unique_ptr< asio::executor_work_guard< asio::io_context::executor_type > > work_guard_
VoidResult error_void(int code, const std::string &message, const std::string &source="network_system", const std::string &details="")
VoidResult ok()

References kcenon::network::error_codes::common_errors::already_exists, kcenon::network::error_codes::network_system::bind_failed, kcenon::network::error_void(), and kcenon::network::ok().

Here is the call graph for this function:

◆ start_cleanup_timer()

auto kcenon::network::protocols::http2::http2_server::start_cleanup_timer ( ) -> void
private

Definition at line 358 of file http2_server.cpp.

359 {
360 if (!io_context_) {
361 return;
362 }
363
364 cleanup_timer_ = std::make_unique<asio::steady_timer>(*io_context_);
365 cleanup_timer_->expires_after(std::chrono::seconds(30));
366 cleanup_timer_->async_wait([this](std::error_code ec) {
367 if (!ec && is_running_) {
370 }
371 });
372 }
std::unique_ptr< asio::steady_timer > cleanup_timer_

◆ start_tls()

auto kcenon::network::protocols::http2::http2_server::start_tls ( unsigned short port,
const tls_config & config ) -> VoidResult

Start HTTP/2 server with TLS.

Parameters
portPort to listen on
configTLS configuration
Returns
Success or error

Starts the server with TLS and ALPN "h2" negotiation.

Definition at line 68 of file http2_server.cpp.

69 {
70 if (is_running_) {
71 return error_void(
73 "Server already running",
74 "http2_server");
75 }
76
77 try {
78 io_context_ = std::make_unique<asio::io_context>();
79 work_guard_ = std::make_unique<asio::executor_work_guard<asio::io_context::executor_type>>(
80 io_context_->get_executor());
81
82 // Setup TLS context
83 ssl_context_ = std::make_unique<asio::ssl::context>(asio::ssl::context::tls_server);
84 ssl_context_->set_options(
85 asio::ssl::context::default_workarounds |
86 asio::ssl::context::no_sslv2 |
87 asio::ssl::context::no_sslv3 |
88 asio::ssl::context::no_tlsv1 |
89 asio::ssl::context::no_tlsv1_1);
90
91 ssl_context_->use_certificate_file(config.cert_file, asio::ssl::context::pem);
92 ssl_context_->use_private_key_file(config.key_file, asio::ssl::context::pem);
93
94 if (!config.ca_file.empty()) {
95 ssl_context_->load_verify_file(config.ca_file);
96 }
97
98 if (config.verify_client) {
99 ssl_context_->set_verify_mode(asio::ssl::verify_peer | asio::ssl::verify_fail_if_no_peer_cert);
100 }
101
102 // Set ALPN callback for HTTP/2
103 SSL_CTX_set_alpn_select_cb(
104 ssl_context_->native_handle(),
105 [](SSL* /*ssl*/, const unsigned char** out, unsigned char* outlen,
106 const unsigned char* in, unsigned int inlen, void* /*arg*/) -> int {
107 // Look for "h2" in client's ALPN list
108 const unsigned char* client = in;
109 const unsigned char* end = in + inlen;
110 while (client < end) {
111 unsigned char len = *client++;
112 if (len == 2 && client + 2 <= end &&
113 client[0] == 'h' && client[1] == '2') {
114 *out = client;
115 *outlen = 2;
116 return SSL_TLSEXT_ERR_OK;
117 }
118 client += len;
119 }
120 return SSL_TLSEXT_ERR_NOACK;
121 },
122 nullptr);
123
124 acceptor_ = std::make_unique<asio::ip::tcp::acceptor>(
126 asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port));
127
128 use_tls_ = true;
129 is_running_ = true;
130
131 // Start I/O thread
132 io_future_ = std::async(std::launch::async, [this]() { run_io(); });
133
134 // Start accepting connections
137
138 return ok();
139 } catch (const std::exception& e) {
140 return error_void(
142 std::string("Failed to start TLS server: ") + e.what(),
143 "http2_server");
144 }
145 }
struct ssl_st SSL
Definition crypto.h:21

References kcenon::network::error_codes::common_errors::already_exists, config, kcenon::network::error_void(), and kcenon::network::ok().

Here is the call graph for this function:

◆ stop()

auto kcenon::network::protocols::http2::http2_server::stop ( ) -> VoidResult

Stop the server.

Returns
Success or error

Sends GOAWAY to all connections and stops accepting new connections.

Definition at line 147 of file http2_server.cpp.

148 {
149 if (!is_running_) {
150 return ok();
151 }
152
153 is_running_ = false;
154
155 // Close acceptor
156 if (acceptor_ && acceptor_->is_open()) {
157 std::error_code ec;
158 acceptor_->close(ec);
159 }
160
161 // Stop all connections
162 {
163 std::lock_guard<std::mutex> lock(connections_mutex_);
164 for (auto& [id, conn] : connections_) {
165 conn->stop();
166 }
167 connections_.clear();
168 }
169
170 // Stop cleanup timer
171 if (cleanup_timer_) {
172 cleanup_timer_->cancel();
173 }
174
175 stop_io();
176
177 // Signal stop
178 try {
179 stop_promise_.set_value();
180 } catch (...) {
181 // Already set
182 }
183
184 return ok();
185 }

References kcenon::network::ok().

Referenced by ~http2_server().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ stop_io()

auto kcenon::network::protocols::http2::http2_server::stop_io ( ) -> void
private

Definition at line 381 of file http2_server.cpp.

382 {
383 if (work_guard_) {
384 work_guard_.reset();
385 }
386
387 if (io_context_) {
388 io_context_->stop();
389 }
390
391 if (io_future_.valid()) {
392 io_future_.wait();
393 }
394 }

◆ wait()

auto kcenon::network::protocols::http2::http2_server::wait ( ) -> void

Wait for server to stop.

Blocks until stop() is called.

Definition at line 192 of file http2_server.cpp.

193 {
194 stop_future_.wait();
195 }

Member Data Documentation

◆ acceptor_

std::unique_ptr<asio::ip::tcp::acceptor> kcenon::network::protocols::http2::http2_server::acceptor_
private

Definition at line 231 of file http2_server.h.

◆ cleanup_timer_

std::unique_ptr<asio::steady_timer> kcenon::network::protocols::http2::http2_server::cleanup_timer_
private

Definition at line 258 of file http2_server.h.

◆ CONNECTION_PREFACE

std::string_view kcenon::network::protocols::http2::http2_server::CONNECTION_PREFACE
staticconstexprprivate
Initial value:
=
"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"

Definition at line 261 of file http2_server.h.

◆ connections_

std::map<uint64_t, std::shared_ptr<http2_server_connection> > kcenon::network::protocols::http2::http2_server::connections_
private

Definition at line 247 of file http2_server.h.

◆ connections_mutex_

std::mutex kcenon::network::protocols::http2::http2_server::connections_mutex_
private

Definition at line 246 of file http2_server.h.

◆ decoder_

std::shared_ptr<hpack_decoder> kcenon::network::protocols::http2::http2_server::decoder_
private

Definition at line 255 of file http2_server.h.

◆ encoder_

std::shared_ptr<hpack_encoder> kcenon::network::protocols::http2::http2_server::encoder_
private

Definition at line 254 of file http2_server.h.

◆ error_handler_

error_handler_t kcenon::network::protocols::http2::http2_server::error_handler_
private

Definition at line 243 of file http2_server.h.

◆ FRAME_HEADER_SIZE

size_t kcenon::network::protocols::http2::http2_server::FRAME_HEADER_SIZE = 9
staticconstexprprivate

Definition at line 263 of file http2_server.h.

◆ io_context_

std::unique_ptr<asio::io_context> kcenon::network::protocols::http2::http2_server::io_context_
private

Definition at line 229 of file http2_server.h.

◆ io_future_

std::future<void> kcenon::network::protocols::http2::http2_server::io_future_
private

Definition at line 233 of file http2_server.h.

◆ is_running_

std::atomic<bool> kcenon::network::protocols::http2::http2_server::is_running_ {false}
private

Definition at line 236 of file http2_server.h.

236{false};

Referenced by ~http2_server().

◆ next_connection_id_

std::atomic<uint64_t> kcenon::network::protocols::http2::http2_server::next_connection_id_ {1}
private

Definition at line 248 of file http2_server.h.

248{1};

◆ request_handler_

request_handler_t kcenon::network::protocols::http2::http2_server::request_handler_
private

Definition at line 242 of file http2_server.h.

◆ server_id_

std::string kcenon::network::protocols::http2::http2_server::server_id_
private

Server identifier.

Definition at line 226 of file http2_server.h.

◆ settings_

http2_settings kcenon::network::protocols::http2::http2_server::settings_
private

Definition at line 251 of file http2_server.h.

◆ ssl_context_

std::unique_ptr<asio::ssl::context> kcenon::network::protocols::http2::http2_server::ssl_context_
private

Definition at line 230 of file http2_server.h.

◆ stop_future_

std::future<void> kcenon::network::protocols::http2::http2_server::stop_future_
private

Definition at line 239 of file http2_server.h.

◆ stop_promise_

std::promise<void> kcenon::network::protocols::http2::http2_server::stop_promise_
private

Definition at line 238 of file http2_server.h.

◆ use_tls_

std::atomic<bool> kcenon::network::protocols::http2::http2_server::use_tls_ {false}
private

Definition at line 237 of file http2_server.h.

237{false};

◆ work_guard_

std::unique_ptr<asio::executor_work_guard<asio::io_context::executor_type> > kcenon::network::protocols::http2::http2_server::work_guard_
private

Definition at line 232 of file http2_server.h.


The documentation for this class was generated from the following files: