8个版本
0.2.0-rc.3 | 2024年5月24日 |
---|---|
0.2.0-rc.1 | 2023年12月18日 |
0.1.0-rc.4 | 2022年6月7日 |
0.1.0-rc.3 | 2022年1月15日 |
0.0.1-rc.9 | 2021年7月23日 |
#921 in Web编程
每月168次下载
用于 rocket-governor-derive
45KB
641 代码行
描述
为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
。
您可以根据需要调整任何组合的method和route_name的Quota
,但返回的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 指南
- https://rocket.rs/v0.5/guide/requests/#request-guards
- https://rocket.rs/v0.5/guide/requests/#error-catchers
许可证
您可以选择使用 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