This commit is contained in:
Mateusz Gruszczyński committed 2026-10-11 22:55:22 +02:00
1 parent 4cc994b3bc
commit 79fd198949
48 files changed
+922 -202

No files matched your search

+48
View File
@@ -109,4 +109,52 @@ mod tests {
assert_eq!(state.buckets.len(), 1);
assert_eq!(state.bucket_count, 2);
}
#[test]
fn user_agent_override_is_isolated_from_other_traffic() {
let mut settings = Settings {
enabled: true,
requests: 3,
burst: 0,
user_agent_limits: vec![UserAgentLimit {
pattern: "*BadBot*".into(), requests: 1, window_seconds: 60, burst: 0,
}],
..Default::default()
};
settings.validate().unwrap();
let limiter = Limiter::new();
let ip = "198.51.100.12".parse().unwrap();
assert!(limiter.check_with_user_agent(7, "a", ip, None, Some("badbot/1.0"), &settings).is_ok());
assert!(limiter.check_with_user_agent(7, "a", ip, None, Some("BADBOT/2"), &settings).is_err());
for _ in 0..3 {
assert!(limiter.check_with_user_agent(7, "a", ip, None, Some("Browser"), &settings).is_ok());
}
assert!(limiter.check_with_user_agent(7, "a", ip, None, Some("Browser"), &settings).is_err());
// The same IP and UA on a different vhost gets a separate quota.
assert!(limiter.check_with_user_agent(7, "b", ip, None, Some("BadBot"), &settings).is_ok());
}
#[test]
fn user_agent_overrides_work_without_base_rate_or_geoip() {
let mut settings = Settings {
enabled: false,
user_agent_limits: vec![UserAgentLimit { pattern: "scanner".into(), requests: 1, window_seconds: 60, burst: 0 }],
..Default::default()
};
settings.validate().unwrap();
let limiter = Limiter::new();
let ip = "192.0.2.100".parse().unwrap();
assert!(limiter.check_with_user_agent(1,"site",ip,None,Some("ScanNER"),&settings).is_ok());
assert!(limiter.check_with_user_agent(1,"site",ip,None,Some("scanner"),&settings).is_err());
assert!(limiter.check_with_user_agent(1,"site",ip,None,None,&settings).is_ok());
}
#[test]
fn user_agent_override_validation_is_bounded_and_unique() {
let mut settings = Settings { user_agent_limits: vec![
UserAgentLimit { pattern: "TEST*".into(), ..Default::default() },
UserAgentLimit { pattern: "test*".into(), ..Default::default() },
], ..Default::default() };
assert!(settings.validate().is_err());
settings.user_agent_limits[1].pattern = "other".into();
assert!(settings.validate().is_ok());
}
}