mirror of
https://github.com/epi052/feroxbuster
synced 2024-07-09 03:55:47 +00:00
Bump leaky-bucket to 0.12.1
This commit is contained in:
parent
a424057166
commit
24514faf9e
26
Cargo.lock
generated
26
Cargo.lock
generated
|
@ -1240,16 +1240,13 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
|||
|
||||
[[package]]
|
||||
name = "leaky-bucket"
|
||||
version = "0.10.0"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "152656838516227a1aeeafa54e6c5997f5dbeb625d2ed01e0732b97bbca4574e"
|
||||
checksum = "28d6c39b1cdaa514a898cd9cfcfbdb03a220264fb9ee08931495291cdda3fe7e"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"lazy_static",
|
||||
"log",
|
||||
"thiserror",
|
||||
"parking_lot",
|
||||
"tokio",
|
||||
"tokio-stream",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1523,9 +1520,9 @@ checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
|
|||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.0"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58"
|
||||
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
"parking_lot_core",
|
||||
|
@ -2416,17 +2413,6 @@ dependencies = [
|
|||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-stream"
|
||||
version = "0.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"pin-project-lite",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-util"
|
||||
version = "0.7.1"
|
||||
|
|
|
@ -55,7 +55,7 @@ rlimit = "0.8.3"
|
|||
ctrlc = "3.2.2"
|
||||
fuzzyhash = "0.2.1"
|
||||
anyhow = "1.0.57"
|
||||
leaky-bucket = "0.10.0"
|
||||
leaky-bucket = "0.12.1"
|
||||
|
||||
[dev-dependencies]
|
||||
tempfile = "3.3.0"
|
||||
|
|
|
@ -6,7 +6,7 @@ use std::{
|
|||
|
||||
use anyhow::Result;
|
||||
use lazy_static::lazy_static;
|
||||
use leaky_bucket::LeakyBucket;
|
||||
use leaky_bucket::RateLimiter;
|
||||
use tokio::{
|
||||
sync::RwLock,
|
||||
time::{sleep, Duration},
|
||||
|
@ -45,7 +45,7 @@ pub(super) struct Requester {
|
|||
target_url: String,
|
||||
|
||||
/// limits requests per second if present
|
||||
rate_limiter: RwLock<Option<LeakyBucket>>,
|
||||
rate_limiter: RwLock<Option<RateLimiter>>,
|
||||
|
||||
/// data regarding policy and metadata about last enforced trigger etc...
|
||||
policy_data: PolicyData,
|
||||
|
@ -94,18 +94,18 @@ impl Requester {
|
|||
})
|
||||
}
|
||||
|
||||
/// build a LeakyBucket, given a rate limit (as requests per second)
|
||||
fn build_a_bucket(limit: usize) -> Result<LeakyBucket> {
|
||||
/// build a RateLimiter, given a rate limit (as requests per second)
|
||||
fn build_a_bucket(limit: usize) -> Result<RateLimiter> {
|
||||
let refill = max((limit as f64 / 10.0).round() as usize, 1); // minimum of 1 per second
|
||||
let tokens = max((limit as f64 / 2.0).round() as usize, 1);
|
||||
let interval = if refill == 1 { 1000 } else { 100 }; // 1 second if refill is 1
|
||||
|
||||
Ok(LeakyBucket::builder()
|
||||
.refill_interval(Duration::from_millis(interval)) // add tokens every 0.1s
|
||||
.refill_amount(refill) // ex: 100 req/s -> 10 tokens per 0.1s
|
||||
.tokens(tokens) // reduce initial burst, 2 is arbitrary, but felt good
|
||||
Ok(RateLimiter::builder()
|
||||
.interval(Duration::from_millis(interval)) // add tokens every 0.1s
|
||||
.refill(refill) // ex: 100 req/s -> 10 tokens per 0.1s
|
||||
.initial(tokens) // reduce initial burst, 2 is arbitrary, but felt good
|
||||
.max(limit)
|
||||
.build()?)
|
||||
.build())
|
||||
}
|
||||
|
||||
/// sleep and set a flag that can be checked by other threads
|
||||
|
@ -127,7 +127,7 @@ impl Requester {
|
|||
let guard = self.rate_limiter.read().await;
|
||||
|
||||
if guard.is_some() {
|
||||
guard.as_ref().unwrap().acquire_one().await?;
|
||||
guard.as_ref().unwrap().acquire_one().await;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
@ -925,10 +925,10 @@ mod tests {
|
|||
/// decrease the scan rate
|
||||
async fn adjust_limit_resets_streak_counter_on_downward_movement() {
|
||||
let (handles, _) = setup_requester_test(None).await;
|
||||
let mut buckets = leaky_bucket::LeakyBuckets::new();
|
||||
let coordinator = buckets.coordinate().unwrap();
|
||||
tokio::spawn(async move { coordinator.await.expect("coordinator errored") });
|
||||
let limiter = buckets.rate_limiter().max(200).build().unwrap();
|
||||
let limiter = RateLimiter::builder()
|
||||
.interval(Duration::from_secs(1))
|
||||
.max(200)
|
||||
.build();
|
||||
|
||||
let scan = FeroxScan::default();
|
||||
scan.add_error();
|
||||
|
@ -1036,10 +1036,10 @@ mod tests {
|
|||
/// set_rate_limiter should exit early when new limit equals the current bucket's max
|
||||
async fn set_rate_limiter_early_exit() {
|
||||
let (handles, _) = setup_requester_test(None).await;
|
||||
let mut buckets = leaky_bucket::LeakyBuckets::new();
|
||||
let coordinator = buckets.coordinate().unwrap();
|
||||
tokio::spawn(async move { coordinator.await.expect("coordinator errored") });
|
||||
let limiter = buckets.rate_limiter().max(200).build().unwrap();
|
||||
let limiter = RateLimiter::builder()
|
||||
.interval(Duration::from_secs(1))
|
||||
.max(200)
|
||||
.build();
|
||||
|
||||
let requester = Requester {
|
||||
handles,
|
||||
|
@ -1068,10 +1068,10 @@ mod tests {
|
|||
async fn tune_sets_expected_values_and_then_waits() {
|
||||
let (handles, _) = setup_requester_test(None).await;
|
||||
|
||||
let mut buckets = leaky_bucket::LeakyBuckets::new();
|
||||
let coordinator = buckets.coordinate().unwrap();
|
||||
tokio::spawn(async move { coordinator.await.expect("coordinator errored") });
|
||||
let limiter = buckets.rate_limiter().max(200).build().unwrap();
|
||||
let limiter = RateLimiter::builder()
|
||||
.interval(Duration::from_secs(1))
|
||||
.max(200)
|
||||
.build();
|
||||
|
||||
let scan = FeroxScan::new(
|
||||
"http://localhost",
|
||||
|
|
Loading…
Reference in New Issue
Block a user