aboutsummaryrefslogtreecommitdiff
path: root/src/http/ratelimiting.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/ratelimiting.rs')
-rw-r--r--src/http/ratelimiting.rs66
1 files changed, 32 insertions, 34 deletions
diff --git a/src/http/ratelimiting.rs b/src/http/ratelimiting.rs
index 12066a9..f0eb8fc 100644
--- a/src/http/ratelimiting.rs
+++ b/src/http/ratelimiting.rs
@@ -346,8 +346,7 @@ pub enum Route {
}
pub(crate) fn perform<'a, F>(route: Route, f: F) -> Result<Response>
-where
- F: Fn() -> RequestBuilder<'a>, {
+ where F: Fn() -> RequestBuilder<'a> {
loop {
// This will block if another thread already has the global
// unlocked already (due to receiving an x-ratelimit-global).
@@ -367,10 +366,10 @@ where
.entry(route)
.or_insert_with(|| {
Arc::new(Mutex::new(RateLimit {
- limit: i64::MAX,
- remaining: i64::MAX,
- reset: i64::MAX,
- }))
+ limit: i64::MAX,
+ remaining: i64::MAX,
+ reset: i64::MAX,
+ }))
})
.clone();
@@ -398,14 +397,15 @@ where
let redo = if response.headers.get_raw("x-ratelimit-global").is_some() {
let _ = GLOBAL.lock().expect("global route lock poisoned");
- Ok(if let Some(retry_after) = parse_header(&response.headers, "retry-after")? {
- debug!("Ratelimited on route {:?} for {:?}ms", route, retry_after);
- thread::sleep(Duration::from_millis(retry_after as u64));
+ Ok(if let Some(retry_after) =
+ parse_header(&response.headers, "retry-after")? {
+ debug!("Ratelimited on route {:?} for {:?}ms", route, retry_after);
+ thread::sleep(Duration::from_millis(retry_after as u64));
- true
- } else {
- false
- })
+ true
+ } else {
+ false
+ })
} else {
lock.post_hook(&response, &route)
};
@@ -462,9 +462,11 @@ impl RateLimit {
if self.remaining == 0 {
let delay = (diff * 1000) + 500;
- debug!("Pre-emptive ratelimit on route {:?} for {:?}ms",
- route,
- delay);
+ debug!(
+ "Pre-emptive ratelimit on route {:?} for {:?}ms",
+ route,
+ delay
+ );
thread::sleep(Duration::from_millis(delay));
return;
@@ -487,30 +489,26 @@ impl RateLimit {
}
Ok(if response.status != StatusCode::TooManyRequests {
- false
- } else if let Some(retry_after) = parse_header(&response.headers, "retry-after")? {
- debug!("Ratelimited on route {:?} for {:?}ms", route, retry_after);
- thread::sleep(Duration::from_millis(retry_after as u64));
+ false
+ } else if let Some(retry_after) = parse_header(&response.headers, "retry-after")? {
+ debug!("Ratelimited on route {:?} for {:?}ms", route, retry_after);
+ thread::sleep(Duration::from_millis(retry_after as u64));
- true
- } else {
- false
- })
+ true
+ } else {
+ false
+ })
}
}
fn parse_header(headers: &Headers, header: &str) -> Result<Option<i64>> {
match headers.get_raw(header) {
- Some(header) => {
- match str::from_utf8(&header[0]) {
- Ok(v) => {
- match v.parse::<i64>() {
- Ok(v) => Ok(Some(v)),
- Err(_) => Err(Error::Http(HttpError::RateLimitI64)),
- }
- },
- Err(_) => Err(Error::Http(HttpError::RateLimitUtf8)),
- }
+ Some(header) => match str::from_utf8(&header[0]) {
+ Ok(v) => match v.parse::<i64>() {
+ Ok(v) => Ok(Some(v)),
+ Err(_) => Err(Error::Http(HttpError::RateLimitI64)),
+ },
+ Err(_) => Err(Error::Http(HttpError::RateLimitUtf8)),
},
None => Ok(None),
}