3 个版本

0.0.3-beta2021 年 5 月 22 日
0.0.2-beta2021 年 5 月 15 日
0.0.1-beta2021 年 5 月 14 日

#698 in HTTP 服务器

Download history 153/week @ 2024-04-01 13/week @ 2024-04-08 11/week @ 2024-04-15 46/week @ 2024-04-22 3/week @ 2024-04-29 27/week @ 2024-05-06 16/week @ 2024-05-13 13/week @ 2024-05-20 24/week @ 2024-05-27 46/week @ 2024-06-03 21/week @ 2024-06-10 18/week @ 2024-06-17 56/week @ 2024-06-24 12/week @ 2024-07-01 36/week @ 2024-07-08 18/week @ 2024-07-15

124 每月下载量
3 crates 使用

MIT/Apache

44KB
1.5K SLoC

gonzales 是业内最快的 HTTP 路由器,且没有不安全代码。

基准测试包括每轮 130 条路由。

#正则匹配

test gonzales ... bench:                363 ns/iter (+/- 15)
test matchit ... bench:                 403 ns/iter (+/- 12)
test bench_regex_set ... bench:         39604 ns/iter (+/- 2274)
test bench_actix ... bench:             55248 ns/iter (+/- 2905)
test bench_route_recognizer ... bench:  13219 ns/iter (+/- 564)

#不区分大小写的匹配

test gonzales ... bench:         423 ns/iter (+/- 11)
test matchit ... bench:        3921 ns/iter (+/- 104)
test actix ... bench:       54038 ns/iter (+/- 1484)
test regex ... bench:       33513 ns/iter (+/- 3388)
test route-recognizer ... bench:       13622 ns/iter (+/- 1177)

匹配输入每个字符需要 1ns。这意味着大多数路由在 10ns20ns 内就能被匹配或未匹配。它支持不区分大小写的匹配,而无需额外的运行时成本。它还支持路径参数提取。

在底层,它使用了一个带有一些额外功能的 DFA。感谢 BurntSushi 在这个领域的贡献以及他优秀的文章,如 这篇

        let route = vec!["/hello/{user_id}", "/helloworld"];
        let router = RouterBuilder::new()
            .ascii_case_insensitive(true)
            .build(route);
        let m = router.route("/HelloWorld")?;

        // the index of the matched route
        let index = m.get_index();
        assert_eq!(1, index);
        
        // route arguments
        let args = m.get_args();
        assert!(args.is_empty());

        // segments matched with `*`
        let segments = m.get_segments();
        assert!(segments.is_empty());
        

路由器还支持多段匹配,使用 *,仅在路由的末尾。 /hello/world/* 将匹配所有以 /hello/world/ 开头的传入请求路径。

向前,向前,走,走!!!

依赖

~73KB