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

HPACK header encoder (RFC 7541) More...

#include <hpack.h>

Collaboration diagram for kcenon::network::protocols::http2::hpack_encoder:
Collaboration graph

Public Member Functions

 hpack_encoder (size_t max_table_size=4096)
 Construct encoder with max table size.
 
auto encode (const std::vector< http_header > &headers) -> std::vector< uint8_t >
 Encode headers to HPACK binary format.
 
auto set_max_table_size (size_t size) -> void
 Set maximum dynamic table size.
 
auto table_size () const -> size_t
 Get current dynamic table size.
 

Private Member Functions

auto encode_integer (uint64_t value, uint8_t prefix_bits) -> std::vector< uint8_t >
 
auto encode_string (std::string_view str, bool huffman=false) -> std::vector< uint8_t >
 
auto encode_indexed (size_t index) -> std::vector< uint8_t >
 
auto encode_literal_with_indexing (std::string_view name, std::string_view value) -> std::vector< uint8_t >
 
auto encode_literal_with_indexing (size_t name_index, std::string_view value) -> std::vector< uint8_t >
 
auto encode_literal_without_indexing (std::string_view name, std::string_view value) -> std::vector< uint8_t >
 
auto encode_literal_without_indexing (size_t name_index, std::string_view value) -> std::vector< uint8_t >
 

Private Attributes

dynamic_table table_
 

Detailed Description

HPACK header encoder (RFC 7541)

Encodes HTTP headers using HPACK compression with dynamic table.

Definition at line 158 of file hpack.h.

Constructor & Destructor Documentation

◆ hpack_encoder()

kcenon::network::protocols::http2::hpack_encoder::hpack_encoder ( size_t max_table_size = 4096)
explicit

Construct encoder with max table size.

Parameters
max_table_sizeMaximum dynamic table size (default 4096)

Definition at line 191 of file hpack.cpp.

192 : table_(max_table_size)
193 {
194 }

Member Function Documentation

◆ encode()

auto kcenon::network::protocols::http2::hpack_encoder::encode ( const std::vector< http_header > & headers) -> std::vector<uint8_t>

Encode headers to HPACK binary format.

Parameters
headersHeaders to encode
Returns
Encoded bytes

Definition at line 196 of file hpack.cpp.

198 {
199 std::vector<uint8_t> result;
200
201 for (const auto& header : headers)
202 {
203 // Try to find in static table first
204 size_t static_index = static_table::find(header.name, header.value);
205 if (static_index > 0)
206 {
207 // Indexed header field representation
208 auto encoded = encode_indexed(static_index);
209 result.insert(result.end(), encoded.begin(), encoded.end());
210 continue;
211 }
212
213 // Try to find in dynamic table
214 auto dynamic_index = table_.find(header.name, header.value);
215 if (dynamic_index.has_value())
216 {
217 // Indexed header field representation
218 size_t index = static_table::size() + 1 + dynamic_index.value();
219 auto encoded = encode_indexed(index);
220 result.insert(result.end(), encoded.begin(), encoded.end());
221 continue;
222 }
223
224 // Check if name is in static table
225 size_t name_index = static_table::find(header.name, "");
226 if (name_index > 0)
227 {
228 // Literal with incremental indexing - indexed name
229 auto encoded = encode_literal_with_indexing(name_index, header.value);
230 result.insert(result.end(), encoded.begin(), encoded.end());
231 table_.insert(header.name, header.value);
232 }
233 else
234 {
235 // Check if name is in dynamic table
236 auto dynamic_name_index = table_.find(header.name, "");
237 if (dynamic_name_index.has_value())
238 {
239 size_t index = static_table::size() + 1 + dynamic_name_index.value();
240 auto encoded = encode_literal_with_indexing(index, header.value);
241 result.insert(result.end(), encoded.begin(), encoded.end());
242 table_.insert(header.name, header.value);
243 }
244 else
245 {
246 // Literal with incremental indexing - new name
247 auto encoded = encode_literal_with_indexing(header.name, header.value);
248 result.insert(result.end(), encoded.begin(), encoded.end());
249 table_.insert(header.name, header.value);
250 }
251 }
252 }
253
254 return result;
255 }
auto find(std::string_view name, std::string_view value="") const -> std::optional< size_t >
Find header in dynamic table.
Definition hpack.cpp:137
auto insert(std::string_view name, std::string_view value) -> void
Insert header at beginning of table.
Definition hpack.cpp:115
auto encode_literal_with_indexing(std::string_view name, std::string_view value) -> std::vector< uint8_t >
Definition hpack.cpp:325
auto encode_indexed(size_t index) -> std::vector< uint8_t >
Definition hpack.cpp:318
static constexpr auto size() -> size_t
Get static table size.
Definition hpack.h:72
static auto find(std::string_view name, std::string_view value="") -> size_t
Find index of header in static table.
Definition hpack.cpp:92

References kcenon::network::protocols::http2::static_table::find(), kcenon::network::protocols::http2::headers, and kcenon::network::protocols::http2::static_table::size().

Here is the call graph for this function:

◆ encode_indexed()

auto kcenon::network::protocols::http2::hpack_encoder::encode_indexed ( size_t index) -> std::vector<uint8_t>
private

Definition at line 318 of file hpack.cpp.

319 {
320 auto result = encode_integer(index, 7);
321 result[0] |= 0x80; // Set indexed bit
322 return result;
323 }
auto encode_integer(uint64_t value, uint8_t prefix_bits) -> std::vector< uint8_t >
Definition hpack.cpp:267

◆ encode_integer()

auto kcenon::network::protocols::http2::hpack_encoder::encode_integer ( uint64_t value,
uint8_t prefix_bits ) -> std::vector<uint8_t>
private

Definition at line 267 of file hpack.cpp.

269 {
270 std::vector<uint8_t> result;
271 uint8_t max_prefix = (1 << prefix_bits) - 1;
272
273 if (value < max_prefix)
274 {
275 result.push_back(static_cast<uint8_t>(value));
276 }
277 else
278 {
279 result.push_back(max_prefix);
280 value -= max_prefix;
281
282 while (value >= 128)
283 {
284 result.push_back(static_cast<uint8_t>((value % 128) + 128));
285 value /= 128;
286 }
287 result.push_back(static_cast<uint8_t>(value));
288 }
289
290 return result;
291 }

◆ encode_literal_with_indexing() [1/2]

auto kcenon::network::protocols::http2::hpack_encoder::encode_literal_with_indexing ( size_t name_index,
std::string_view value ) -> std::vector<uint8_t>
private

Definition at line 345 of file hpack.cpp.

348 {
349 std::vector<uint8_t> result;
350
351 // Encode name index with 6-bit prefix
352 auto index_bytes = encode_integer(name_index, 6);
353 index_bytes[0] |= 0x40; // Set literal with indexing bit
354 result.insert(result.end(), index_bytes.begin(), index_bytes.end());
355
356 // Encode value
357 auto value_bytes = encode_string(value);
358 result.insert(result.end(), value_bytes.begin(), value_bytes.end());
359
360 return result;
361 }
auto encode_string(std::string_view str, bool huffman=false) -> std::vector< uint8_t >
Definition hpack.cpp:293

◆ encode_literal_with_indexing() [2/2]

auto kcenon::network::protocols::http2::hpack_encoder::encode_literal_with_indexing ( std::string_view name,
std::string_view value ) -> std::vector<uint8_t>
private

Definition at line 325 of file hpack.cpp.

328 {
329 std::vector<uint8_t> result;
330
331 // First byte: 01xxxxxx (literal with incremental indexing, new name)
332 result.push_back(0x40);
333
334 // Encode name
335 auto name_bytes = encode_string(name);
336 result.insert(result.end(), name_bytes.begin(), name_bytes.end());
337
338 // Encode value
339 auto value_bytes = encode_string(value);
340 result.insert(result.end(), value_bytes.begin(), value_bytes.end());
341
342 return result;
343 }

◆ encode_literal_without_indexing() [1/2]

auto kcenon::network::protocols::http2::hpack_encoder::encode_literal_without_indexing ( size_t name_index,
std::string_view value ) -> std::vector<uint8_t>
private

Definition at line 383 of file hpack.cpp.

386 {
387 std::vector<uint8_t> result;
388
389 // Encode name index with 4-bit prefix
390 auto index_bytes = encode_integer(name_index, 4);
391 // First byte already has 0000 prefix for literal without indexing
392 result.insert(result.end(), index_bytes.begin(), index_bytes.end());
393
394 // Encode value
395 auto value_bytes = encode_string(value);
396 result.insert(result.end(), value_bytes.begin(), value_bytes.end());
397
398 return result;
399 }

◆ encode_literal_without_indexing() [2/2]

auto kcenon::network::protocols::http2::hpack_encoder::encode_literal_without_indexing ( std::string_view name,
std::string_view value ) -> std::vector<uint8_t>
private

Definition at line 363 of file hpack.cpp.

366 {
367 std::vector<uint8_t> result;
368
369 // First byte: 0000xxxx (literal without indexing, new name)
370 result.push_back(0x00);
371
372 // Encode name
373 auto name_bytes = encode_string(name);
374 result.insert(result.end(), name_bytes.begin(), name_bytes.end());
375
376 // Encode value
377 auto value_bytes = encode_string(value);
378 result.insert(result.end(), value_bytes.begin(), value_bytes.end());
379
380 return result;
381 }

◆ encode_string()

auto kcenon::network::protocols::http2::hpack_encoder::encode_string ( std::string_view str,
bool huffman = false ) -> std::vector<uint8_t>
private

Definition at line 293 of file hpack.cpp.

295 {
296 std::vector<uint8_t> result;
297
298 // String length (with Huffman bit)
299 auto length_bytes = encode_integer(str.size(), 7);
300 if (!huffman)
301 {
302 result.insert(result.end(), length_bytes.begin(), length_bytes.end());
303 }
304 else
305 {
306 // Huffman encoding not implemented yet
307 // Set H bit in first byte
308 length_bytes[0] |= 0x80;
309 result.insert(result.end(), length_bytes.begin(), length_bytes.end());
310 }
311
312 // String data
313 result.insert(result.end(), str.begin(), str.end());
314
315 return result;
316 }
Huffman coding for HPACK string compression.

◆ set_max_table_size()

auto kcenon::network::protocols::http2::hpack_encoder::set_max_table_size ( size_t size) -> void

Set maximum dynamic table size.

Parameters
sizeNew maximum size

Definition at line 257 of file hpack.cpp.

258 {
259 table_.set_max_size(size);
260 }
auto set_max_size(size_t size) -> void
Set maximum table size.
Definition hpack.cpp:154

◆ table_size()

auto kcenon::network::protocols::http2::hpack_encoder::table_size ( ) const -> size_t

Get current dynamic table size.

Returns
Current size in bytes

Definition at line 262 of file hpack.cpp.

263 {
264 return table_.current_size();
265 }
auto current_size() const -> size_t
Get current table size.
Definition hpack.cpp:160

References kcenon::network::protocols::http2::dynamic_table::current_size(), and table_.

Here is the call graph for this function:

Member Data Documentation

◆ table_

dynamic_table kcenon::network::protocols::http2::hpack_encoder::table_
private

Definition at line 199 of file hpack.h.

Referenced by table_size().


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