6个版本
0.1.3 | 2020年11月17日 |
---|---|
0.1.2 | 2020年11月11日 |
0.0.1 | 2020年10月16日 |
#1028 in 编码
95 每月下载量
在 pawprint 中使用
6.5MB
8K SLoC
httlib-hpack
此crate实现了HPACK,这是HTTP/2中高效表示HTTP头部字段的压缩格式。它提供了一个简单的API,用于执行HTTP头部的编码和解码。
关于
HPACK是一种压缩格式,可以消除请求和响应中的冗余头部字段。这是HTTP/2协议显著减少从一个实体到另一个实体传输数据量的功能之一。
实现HTTP/2协议需要实施者进行重大的思维转变。在HTTP/2中,一个连接并不代表一个单一的请求/响应会话。我们可以在一个连接中启动多个同时流,表示多个请求/响应会话,这在HTTP协议的先前版本中是不可能的。HPACK压缩器通过考虑整个连接而不是每个流来索引头部,利用了HTTP/2的这个特性。
HPACK的实现包含三个主要过程部分
-
索引表
是一个列表,HPACK将其常用头部保存在其中。每个实体根据连接索引头部,分别对传入(解码)和传出(编码)数据分别进行索引。 -
编码器
执行数据压缩的任务。它通过应用HPACK规范中定义的规则,将数据从原始的可读形式转换为优化的字节序列。 -
解码器
负责压缩器的任务。它执行与编码器相反的命令。它将数据转换回可读的形式。
用法
编码示例
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();
解码示例
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
}
}
文章
许可证:MIT