httlib-hpack

Crates.iohttlib-hpack
lib.rshttlib-hpack
version0.1.3
sourcesrc
created_at2020-10-15 20:23:09.919126
updated_at2020-11-17 18:06:01.636355
descriptionHPACK format implementation for HTTP/2.
homepagehttps://github.com/xpepermint/httlib-rs/tree/main/hpack
repositoryhttps://github.com/xpepermint/httlib-rs
max_upload_size
id300216
size65,147,820
Kristijan Sedlak (xpepermint)

documentation

https://docs.rs/httlib-hpack

README

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:

  • 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.

  • Encoder performs the task of data compression. It converts the data from its original readable form into an optimized byte sequence by applying the rules defined in the HPACK specification.

  • Decoder takes over the task of the decompressor. It executes the commands inversely to the encoder. It converts the data back into its readable form.

Usage

Encoding example:

use httlib_hpack::Encoder;

let mut encoder = Encoder::default();

let name = b":method".to_vec();
let value = b"PATCH".to_vec();
let flags = Encoder::HUFFMAN_VALUE | Encoder::WITH_INDEXING | Encoder::BEST_FORMAT;

let mut dst = Vec::new();
encoder.encode((name, value, flags), &mut dst).unwrap();

Decoding example:

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::NEVER_INDEXED == Decoder::NEVER_INDEXED {
        // sensitive header
    } else {
        // common header
    }
}

Articles

License: MIT

Commit count: 124

cargo fmt