This crate implements [HPACK], a compression format for efficiently representing HTTP header fields in [HTTP/2]. It exposes a simple API for performing the encoding and decoding of HTTP headers.
[HPACK] is a compression format that eliminates redundant header fields in requests and responses. This is one of the features based on which the [HTTP/2] protocol significantly reduces the amount of transferred data from one entity to another.
A significant shift in thinking is required from the implementer of the [HTTP/2] protocol. A connection in [HTTP/2] does not represent a single request/response session. We can start multiple simultaneous streams in one connection, representing multiple request/response sessions, which was not possible in the previous versions of the HTTP protocol. The [HPACK] compressor uses this characteristic of [HTTP/2] by indexing headers considering the whole connection and not per stream.
The implementation of [HPACK] contains three main parts of the process:
Indexing table
is a list, to which the HPACK saves the commonly used
headers. Each entity indexes headers per connection, separately for incoming
(decoding) and for outgoing (encoding) data ([2.3.]).
Encoder
TODO!!!!!
Decoder
TODO!!!!!
Encoding example:
```rust use httlib_hpack::Encoder;
let mut encoder = Encoder::default(); let mut dst = Vec::new(); let name = b":method".tovec(); let value = b"PATCH".tovec(); let flags = Encoder::HUFFMANVALUE | Encoder::WITHINDEXING | Encoder::BEST_FORMAT; encoder.encode((name, value, flags), &mut dst).unwrap(); ```
Decoding example:
```rust use httlib_hpack::Decoder;
let mut decoder = Decoder::default(); let mut buf = vec![0x80 | 2]; let mut dst = Vec::new(); decoder.decode(&mut buf, &mut dst).unwrap();
for (name, value, flags) in dst { if flags & Decoder::NEVERINDEXED == Decoder::NEVERINDEXED { // sensitive header } else { // common header } } ```
License: MIT