8个版本

0.2.0-rc.32024年5月24日
0.2.0-rc.12023年12月18日
0.1.0-rc.42022年6月7日
0.1.0-rc.32022年1月15日
0.0.1-rc.92021年7月23日

#921 in Web编程

Download history 8/week @ 2024-05-03 6/week @ 2024-05-10 9/week @ 2024-05-17 245/week @ 2024-05-24 101/week @ 2024-05-31 62/week @ 2024-06-07 51/week @ 2024-06-14 20/week @ 2024-06-21 6/week @ 2024-06-28 12/week @ 2024-07-05 38/week @ 2024-07-26 50/week @ 2024-08-02 24/week @ 2024-08-09 56/week @ 2024-08-16

每月168次下载
用于 rocket-governor-derive

MIT/Apache

45KB
641 代码行

Rust crates.io docs

描述

为Rocket网页框架实现的Governor速率限制器Governor

速率限制用于控制应用程序或Web服务端点接收和处理请求的速率。

Rocket特定功能

使用Governor的Quota定义您Rocket网页应用/服务中需要的任意多个速率限制。
它作为Rocket的请求守卫实现,并提供错误捕获器的实现。
错误捕获器可以注册在任何路径上以处理Status::TooManyRequests并提供HTTP头信息。

使用方法

在您的Cargo.toml中添加rocket-governor crate的依赖项。

guard struct实现RocketGovernable

use rocket_governor::{Method, Quota, RocketGovernable, RocketGovernor};

pub struct RateLimitGuard;

impl<'r> RocketGovernable<'r> for RateLimitGuard {
    fn quota(_method: Method, _route_name: &str) -> Quota {
        Quota::per_second(Self::nonzero(1u32))
    }
}

这需要实现方法fn quota(_: Method, _: &str) -> Quota
您可以根据需要调整任何组合的methodroute_nameQuota,但返回的Quota应该是类似于静态的。它应该在具有相同参数的quota()方法调用之间保持不变。

存在一个小的辅助函数 nonzero(u32),用于在您的 quota() 实现中创建配额,例如。

    Quota::per_second(Self::nonzero(1u32))

在实现 trait RocketGovernable 的基本要求后,您可以将您的 Guard 添加到路由方法中,例如:

#[get("/")]
fn route_test(_limitguard: RocketGovernor<RateLimitGuard>) -> Status {
    Status::Ok
}

注册捕获器

要处理 HTTP 状态 429 TooManyRequests,有一个捕获器函数实现。

它被称为 rocket_governor_catcher

使用 Rocket 的 register(<path>, <catchers>) 方法注册它

use rocket_governor::rocket_governor_catcher;

#[launch]
fn launch_rocket() -> _ {
    rocket::build()
        .mount("/", routes![route_test])
        .register("/", catchers!(rocket_governor_catcher))
}

可选功能 limit_info

存在可选功能 limit_info,它允许在请求的 HTTP 头部报告中启用关于速率限制的报道。

该实现基于 https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-ratelimit-headers 的头部

该功能提供了一种 Rocket fairing 的默认实现,需要使用它来设置 HTTP 头部。

有关 LimitHeaderGen 的 API 文档。

在 Cargo.toml 中根据其使用

[dependencies]
rocket-governor = { version = "...", features = ["limit_info"] }

可选功能 logger

存在可选功能 logger,它允许一些日志输出。

在 Cargo.toml 中根据其使用

[dependencies]
rocket-governor = { version = "...", features = ["logger"] }

附加信息

要了解 Rocket 的基础知识,请访问 Rocket 指南

许可证

您可以选择使用 MIT 许可证Apache 许可证 2.0

MIT 许可证

版权所有 (c) 2023 Markus Kolb

特此授予任何获得此软件及其相关文档副本(“软件”)的人免费处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许获得软件的人进行此类操作,但受以下条件约束:

上述版权声明和本许可通知(包括下一段)应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论是在合同行为、侵权行为或其他行为中产生的,无论是由于软件或其使用或其他方式与软件有关。

Apache 许可证 2.0

版权所有 2023 Markus Kolb

根据 Apache 许可证版本 2.0(“许可证”);除非法律要求或书面同意,否则不得使用此文件,除非遵守许可证。您可以在以下位置获得许可证的副本:

http://www.apache.org/licenses/LICENSE-2.0

除非法律要求或书面同意,否则根据许可证分发的软件按“原样”分发,不提供任何明示或暗示的保证,无论是关于其适用性、质量还是性能的。有关许可证的具体语言,请参阅许可证。

依赖项

~16–48MB
~810K SLoC