3个不稳定版本

新版本 0.4.0 2024年8月21日
0.3.2 2024年8月14日
0.3.1 2024年8月14日

#204 in 编码

Download history 274/week @ 2024-08-12

274 monthly downloads
4 个crate中(直接使用2个)使用

MIT 许可证

135KB
2.5K SLoC

loona-hpack

The loona logo: a lunatic moon looking threatening and like it drank a beer it wasn't supposed to. Also pimples.

Logo由 MisiasArt 设计

在Rust中实现的HPACK编解码器。

从2023年1月https://github.com/mlalic/hpack-rs 分支出来,以增加功能并使loona通过h2spec。

概览

该库允许您根据HPACK规范执行头压缩和解压缩。

解码器模块实现了执行HPACK解码的API。在Decoder结构体的生命周期中,它将跟踪解码上下文(即同一连接上的后续头应使用相同的实例进行解码)。

解码器实现了完整的规范,并允许解码任何表示压缩头列表的有效字节序列。

编码器模块实现了执行HPACK编码的API。在Encoder结构体的生命周期中,它将跟踪编码上下文(即应使用相同的实例来编码同一连接上的所有头)。

到目前为止,编码器尚未实现Huffman字符串字面量编码;然而,这足以能够向任何HPACK兼容的服务器发送请求,因为Huffman编码是完全可选的。

示例

编码

编码一些完全由静态头表索引的伪头。

use loona_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 loona_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许可证发布。

依赖项

~0.6–1.2MB
~23K SLoC