From fa13197bb725eb2fc8ce4047ad8c1aed16e90f00 Mon Sep 17 00:00:00 2001 From: kelbon <58717435+kelbon@users.noreply.github.com> Date: Thu, 17 Oct 2024 01:01:22 +0400 Subject: [PATCH] Create README.md --- README.md | 60 +++++++++++++++++++++++++++++++++++++++ include/hpack/decoder.hpp | 3 +- src/decoder.cpp | 1 - 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..cde824a --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ + +Complete implementation of HPACK (Header Compression for HTTP/2, fully compliant RFC 7541) + +encode: + +```cpp +#include + +void encode_my_headers(hpack::encoder& enc, std::vector& bytes;) { + // memory effective by default + enc.encode("name", "value", std::back_inserter(bytes)); + // or by hands + enc.encode_header_fully_indexed(hpack::static_table_t::status_200, std::back_inserter(bytes)); +} + +``` + +decode + +```cpp +#include + +void decode_my_headers(hpack::decoder& d, std::span bytes) { + hpack::decode_headers_block(e, bytes, [&](std::string_view name, std::string_view value) { + // use name/value somehow + }); +} + +``` + +adding with cmake: + +Preferred way with [CPM](https://github.com/cpm-cmake/CPM.cmake) + +```cmake + +CPMAddPackage( + NAME HPACK + GIT_REPOSITORY https://github.com/kelbon/HPACK + GIT_TAG origin/master +) + +target_link_libraries(MyTargetName hpacklib) + +``` + +simple way with fetch content: + +```cmake + +include(FetchContent) +FetchContent_Declare( + HPACK + GIT_REPOSITORY https://github.com/kelbon/HPACK + GIT_TAG origin/master +) +FetchContent_MakeAvailable(HPACK) +target_link_libraries(MyTargetName hpacklib) + +``` diff --git a/include/hpack/decoder.hpp b/include/hpack/decoder.hpp index 0e55386..32330bf 100644 --- a/include/hpack/decoder.hpp +++ b/include/hpack/decoder.hpp @@ -110,7 +110,7 @@ struct header_view { // header may be not present if default contructed or table_size_update happen instead of header explicit operator bool() const noexcept { - return name || value; + return !!name; } header_view& operator=(header_view&&) = default; @@ -142,6 +142,7 @@ struct decoder { void decode_header(In& in, In e, header_view& out); // returns status code + // its always first header of response, so 'in' must point to first byte of headers block int decode_response_status(In& in, In e); }; diff --git a/src/decoder.cpp b/src/decoder.cpp index f70d82e..7c65a6a 100644 --- a/src/decoder.cpp +++ b/src/decoder.cpp @@ -182,7 +182,6 @@ void decoder::decode_header(In& in, In e, header_view& out) { handle_protocol_error(); } -// returns status code int decoder::decode_response_status(In& in, In e) { if (*in & 0b1000'0000) { // fast path, fully indexed