6个版本

0.1.3 2020年11月17日
0.1.2 2020年11月11日
0.0.1 2020年10月16日

#1028 in 编码

Download history 3/week @ 2024-03-13 13/week @ 2024-03-27 18/week @ 2024-04-03 3/week @ 2024-04-17 907/week @ 2024-04-24 143/week @ 2024-05-01 2/week @ 2024-05-08 8/week @ 2024-05-15 17/week @ 2024-05-22 1/week @ 2024-06-05 1/week @ 2024-06-12 31/week @ 2024-06-19 62/week @ 2024-06-26

95 每月下载量
pawprint 中使用

MIT 许可证

6.5MB
8K SLoC

httlib-hpack

此crate实现了HPACK,这是HTTP/2中高效表示HTTP头部字段的压缩格式。它提供了一个简单的API,用于执行HTTP头部的编码和解码。

Documentation Source

关于

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

依赖项