3 个稳定版本

1.0.5 2023年8月14日

#215 in 日期和时间

Download history 639/week @ 2024-04-16 1216/week @ 2024-04-23 1201/week @ 2024-04-30 1369/week @ 2024-05-07 1117/week @ 2024-05-14 1353/week @ 2024-05-21 1165/week @ 2024-05-28 1281/week @ 2024-06-04 1371/week @ 2024-06-11 1508/week @ 2024-06-18 1514/week @ 2024-06-25 1518/week @ 2024-07-02 1492/week @ 2024-07-09 1640/week @ 2024-07-16 1654/week @ 2024-07-23 1210/week @ 2024-07-30

6,174 每月下载量
用于 3 个 Crates(通过 ruma-client-api

MIT/Apache

26KB
474

解析和格式化 HTTP 日期:头

Crates.io Documentation

多个 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/

无运行时依赖