pub enum ThrottleDecision {
Allow {
remaining: u32,
},
Banned {
until: u64,
},
Unavailable,
}Variants§
Allow
放行,remaining 为窗口内剩余可失败次数(可写进 X-RateLimit-* 响应头)。
remaining == 0 表示本请求应被拒绝(额度已耗尽),不是「还能再试一次」;
调用方必须据此拒绝,否则最后一次额度形同虚设。仍叫 Allow 而非 Banned,
是因为此刻并没有封禁在生效 —— 例如 ban_secs = 0 的配置下,额度耗尽的 key
会一直落在这一支。
Banned
已封禁,until 是解封时刻(unix 秒)。now >= until 即视为已解封。
存储后端不可用,本模块不替调用方做决定。
与 session 模块的 fail-closed 有意不同:限流是纵深防御而非主认证闸门, 后端抖动时把全体用户挡在门外是自我 DoS,而放行只是暂时失去暴力破解防护 —— 主认证闸门(SessionGuard)仍然在拦。调用方拿到这个变体后自行选择 (建议:放行 + 告警)。
这条「不 fail-closed」是写死的设计,不是漏写的兜底:Throttle::check 里
只把 Err 映射到本变体,绝不映射到 Banned。
只由 guard::Throttle::check / guard::Throttle::check_any 产生。
guard::Throttle::record_failure 没有这个变体(它返回
ThrottleOutcome,故障走 Err),所以调用方不必为它写死分支。
Trait Implementations§
Source§impl Clone for ThrottleDecision
impl Clone for ThrottleDecision
impl Copy for ThrottleDecision
Source§impl Debug for ThrottleDecision
impl Debug for ThrottleDecision
Source§impl Display for ThrottleDecision
状态标签,与 Severity 同样用大写。
impl Display for ThrottleDecision
状态标签,与 Severity 同样用大写。
impl Eq for ThrottleDecision
Source§impl PartialEq for ThrottleDecision
impl PartialEq for ThrottleDecision
impl StructuralPartialEq for ThrottleDecision
Auto Trait Implementations§
impl Freeze for ThrottleDecision
impl RefUnwindSafe for ThrottleDecision
impl Send for ThrottleDecision
impl Sync for ThrottleDecision
impl Unpin for ThrottleDecision
impl UnsafeUnpin for ThrottleDecision
impl UnwindSafe for ThrottleDecision
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more