2个版本
0.3.1 | 2024年5月28日 |
---|---|
0.3.0 | 2023年10月3日 |
#63 in 压缩
135KB
2.5K SLoC
fluke-hpack
使用Rust实现的HPACK编码器。
从2023年1月https://github.com/mlalic/hpack-rs 分支,以添加功能并让fluke通过h2spec。
概述
该库允许您根据HPACK规范执行头部压缩和解压缩。
解码器 模块实现了执行HPACK解码的API。在生命周期内,Decoder
结构将跟踪解码上下文(即,在相同连接上的后续头应使用相同的实例进行解码)。
解码器实现了完整的规范,并允许解码任何表示压缩头列表的有效字节序列。
编码器 模块实现了执行HPACK编码的API。在生命周期内,Encoder
结构将跟踪编码上下文(即,应使用相同的实例对同一连接上的所有头部进行编码)。
到目前为止,编码器尚未实现Huffman字符串字面量编码;然而,这已经足够发送请求到任何HPACK兼容服务器,因为Huffman编码是完全可选的。
示例
编码
编码一些由静态头部表完全索引的伪头部。
use fluke_hpack::Encoder;
let mut encoder = Encoder::new();
let headers = vec![
(b":method".to_vec(), b"GET".to_vec()),
(b":path".to_vec(), b"/".to_vec()),
];
// The headers are encoded by providing their index (with a bit flag
// indicating that the indexed representation is used).
assert_eq!(
encoder.encode(headers.iter().map(|h| (&h.0[..], &h.1[..]))),
vec![2 | 0x80, 4 | 0x80]
);
解码
从原始字节序列中解码头部。在这种情况下,它们都由静态表索引。
use fluke_hpack::Decoder;
let mut decoder = Decoder::new();
let header_list = decoder.decode(&[0x82, 0x84]).unwrap();
assert_eq!(header_list, [
(b":method".to_vec(), b"GET".to_vec()),
(b":path".to_vec(), b"/".to_vec()),
]);
互操作性
解码器已测试与已将结果发布到http2jp/hpack-test-case仓库的HPACK编码器进行互操作性。
许可协议
该项目在MIT许可协议下发布。
依赖关系
~310–415KB