Crates.io | httlib-hpack |
lib.rs | httlib-hpack |
version | 0.1.3 |
source | src |
created_at | 2020-10-15 20:23:09.919126 |
updated_at | 2020-11-17 18:06:01.636355 |
description | HPACK format implementation for HTTP/2. |
homepage | https://github.com/xpepermint/httlib-rs/tree/main/hpack |
repository | https://github.com/xpepermint/httlib-rs |
max_upload_size | |
id | 300216 |
size | 65,147,820 |
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.
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.
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
}
}
License: MIT