Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
quic.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
8
9#include <atomic>
10#include <chrono>
11#include <sstream>
12
14
15namespace {
16
20auto generate_unique_id(std::string_view prefix) -> std::string
21{
22 static std::atomic<uint64_t> counter{0};
23 auto now = std::chrono::steady_clock::now().time_since_epoch().count();
24 auto count = counter.fetch_add(1);
25
26 std::ostringstream oss;
27 oss << prefix << "-" << now << "-" << count;
28 return oss.str();
29}
30
34auto parse_url(std::string_view url) -> std::pair<std::string, uint16_t>
35{
36 std::string url_str(url);
37
38 // Remove quic:// prefix if present
39 const std::string quic_prefix = "quic://";
40 if (url_str.substr(0, quic_prefix.size()) == quic_prefix) {
41 url_str = url_str.substr(quic_prefix.size());
42 }
43
44 // Find the last colon for port separation
45 auto colon_pos = url_str.rfind(':');
46 if (colon_pos == std::string::npos) {
47 return {"", 0};
48 }
49
50 std::string host = url_str.substr(0, colon_pos);
51 std::string port_str = url_str.substr(colon_pos + 1);
52
53 uint16_t port = 0;
54 try {
55 port = static_cast<uint16_t>(std::stoi(port_str));
56 } catch (...) {
57 return {"", 0};
58 }
59
60 return {host, port};
61}
62
66auto extract_server_name(std::string_view url) -> std::string
67{
68 auto [host, port] = parse_url(url);
69 return host;
70}
71
72} // namespace
73
74auto create_connection(const quic_config& config, std::string_view id)
75 -> std::unique_ptr<unified::i_connection>
76{
77 std::string connection_id = id.empty()
78 ? generate_unique_id("quic-conn")
79 : std::string(id);
80
81 return std::make_unique<unified::adapters::quic_connection_adapter>(
82 config, connection_id);
83}
84
85auto connect(const unified::endpoint_info& endpoint,
86 const quic_config& config,
87 std::string_view id) -> std::unique_ptr<unified::i_connection>
88{
89 // Ensure server_name is set for TLS
90 quic_config cfg = config;
91 if (cfg.server_name.empty()) {
92 cfg.server_name = endpoint.host;
93 }
94
95 auto conn = create_connection(cfg, id);
96 // Initiate connection (async, will complete in background)
97 (void)conn->connect(endpoint);
98 return conn;
99}
100
101auto connect(std::string_view url,
102 const quic_config& config,
103 std::string_view id) -> std::unique_ptr<unified::i_connection>
104{
105 auto [host, port] = parse_url(url);
106 if (host.empty() || port == 0) {
107 // Return a connection that will fail on connect
108 return create_connection(config, id);
109 }
110
111 // Ensure server_name is set for TLS
112 quic_config cfg = config;
113 if (cfg.server_name.empty()) {
114 cfg.server_name = host;
115 }
116
117 auto conn = create_connection(cfg, id);
118 (void)conn->connect(unified::endpoint_info{host, port});
119 return conn;
120}
121
122auto create_listener(const quic_config& config, std::string_view id)
123 -> std::unique_ptr<unified::i_listener>
124{
125 std::string listener_id = id.empty()
126 ? generate_unique_id("quic-listener")
127 : std::string(id);
128
129 return std::make_unique<unified::adapters::quic_listener_adapter>(
130 config, listener_id);
131}
132
133auto listen(const unified::endpoint_info& bind_address,
134 const quic_config& config,
135 std::string_view id) -> std::unique_ptr<unified::i_listener>
136{
137 auto listener = create_listener(config, id);
138 (void)listener->start(bind_address);
139 return listener;
140}
141
142auto listen(uint16_t port, const quic_config& config, std::string_view id)
143 -> std::unique_ptr<unified::i_listener>
144{
145 return listen(unified::endpoint_info{"0.0.0.0", port}, config, id);
146}
147
148} // namespace kcenon::network::protocol::quic
tracing_config config
Definition exporters.cpp:29
auto create_listener(const quic_config &config, std::string_view id="") -> std::unique_ptr< unified::i_listener >
Creates a QUIC listener (not yet listening)
Definition quic.cpp:122
auto connect(const unified::endpoint_info &endpoint, const quic_config &config={}, std::string_view id="") -> std::unique_ptr< unified::i_connection >
Creates and connects a QUIC connection in one call.
Definition quic.cpp:85
auto listen(const unified::endpoint_info &bind_address, const quic_config &config, std::string_view id="") -> std::unique_ptr< unified::i_listener >
Creates and starts a QUIC listener in one call.
Definition quic.cpp:133
auto create_connection(const quic_config &config={}, std::string_view id="") -> std::unique_ptr< unified::i_connection >
Creates a QUIC connection (not yet connected)
Definition quic.cpp:74
QUIC protocol connection factory and configuration.
Configuration options for QUIC connections.
Definition quic.h:45
std::string server_name
Server name for TLS SNI (required for client connections)
Definition quic.h:47
Network endpoint information (host/port or URL)
Definition types.h:56