1
Fork 0
mirror of https://github.com/Steffo99/todocolors.git synced 2024-11-22 08:14:18 +00:00

Begin writing some rate limiting functions

This commit is contained in:
Steffo 2023-09-29 11:21:50 +02:00
parent a0342d9aa8
commit d47b7261e5
2 changed files with 35 additions and 0 deletions

View file

@ -0,0 +1,34 @@
//! Rate limiting for board websocket.
use axum::extract::ws::CloseCode;
use redis::Connection;
use crate::outcome::LoggableOutcome;
pub fn rate_limit_by_key(
mut rconn: Connection,
key: String,
increment: usize,
limit: usize,
expiration_s: usize
) -> Result<(), CloseCode> {
log::trace!("Incrementing rate limit counter for {key:?}...");
let response: usize = rconn.cmd("INCRBY")
.arg(&key)
.arg(increment)
.log_err_to_error("Could not increase rate limit counter")
.map_err(|_| 1011u16)?;
log::trace!("Refreshing rate limit counter expiration for {key:?}...");
rconn.cmd("EXPIRE")
.arg(&key)
.arg(expiration_s)
.log_err_to_warn("Could not set expiration for rate limit counter");
log::trace!("Checking rate limit of {limit} / {expiration_s} s for {key:?}...");
if response > limit {
log::warn!("Hit rate limit of {limit} / {expiration_s} s for {key:?}: counter is at {response}!");
return Err(1008u16);
}
Ok(())
}

View file

@ -7,5 +7,6 @@ pub(self) mod ws_receive;
pub(self) mod redis_xadd;
pub(self) mod redis_xread;
pub(self) mod ws_send;
pub(self) mod limit;
pub(crate) use self::axum::handler as board_websocket;