httlib-hpack

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.

Documentation Source

About

[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:

Usage

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 } } ```

Articles

License: MIT