3 个稳定版本
1.0.5 | 2023年8月14日 |
---|
#215 in 日期和时间
6,174 每月下载量
用于 3 个 Crates(通过 ruma-client-api)
26KB
474 行
解析和格式化 HTTP 日期:头
多个 HTTP 头字段存储时间戳。例如,2015年5月15日创建的响应可能包含头 Date: Fri, 15 May 2015 15:34:21 GMT
。由于时间戳不包含任何时区或闰秒信息,它相当于 1431696861 Unix 时间。
该库提供了两个函数
parse
将 HTTP 日期时间字符串解析为 u64 Unix 时间戳format
将 u64 Unix 时间戳格式化为 IMF-fixdate
let header = b"Fri, 15 May 2015 15:34:21 GMT";
assert_eq!(Ok(1431704061), date_header::parse(header));
let mut header = [0u8; 29];
assert_eq!(Ok(()), date_header::format(1431704061, &mut header));
assert_eq!(&header, b"Fri, 15 May 2015 15:34:21 GMT");
日期头在技术上应该包含一个 IMF-fixdate 值,但实际上存在三种格式。该库在调用 parse 时尝试解析所有三种格式。
这是对 https://github.com/pyfisch/httpdate 的分支,以修复我在使用它时发现的一些轻微的烦恼。
更改包括
- 该库将格式化到 &mut [u8],以便更容易与 &[std::io::IoSlice] 一起使用。
- 该库从 &[u8] 而不是 &str 解析,因为在解析 HTTP 头时通常是这样。
- 该库是 no_std。
- 该库不进行任何分配。
- 当给定 9999 年之后的日期时间戳时,该库不会 panic。
- 该库的代码更简单。(主观的,但我想大多数人都会同意。)
- 该库使用 proptest 和更多边缘测试进行了更全面的测试。
- 原始库使用了 fuzz,我从未使用过,但它 似乎 只测试真正的随机输入。这意味着模糊测试从未真正执行过解析代码,因为没有任何输入是有效值。(随机生成 29 个字节恰好是有效时间戳的可能性实际上是不可能的。)
- 该库的模糊/prop 测试生成随机有效输入,并断言解析成功,并且解析/解码是不变的。
- 我还包括了一些关于纪元、IMF-fixdate 格式可以表示的最远日期和闰年的手动选择的边缘情况测试。
- 这个crate通过分析而不是将解析的值转换为SystemTime然后再转换回第二个解析值(带有正确的工作日)来验证日期标题中(冗余的)工作日部分的正确性。
- Criterion在4个基准中的3个上报告了大约-65%的改进,虽然我不太确定原因,但这似乎只是因为不进行SystemTime转换而取得的巨大改进。
- 第四个基准也以类似的比例提高了,但它在原始crate中似乎不正确,所以我没有包括它。
- 我没有因为性能原因创建分支,所以我对精确的改进并不太关心。
以下是pyfisch关于原始crate的博客文章链接:https://pyfisch.org/blog/http-datetime-handling/