use super::{header::Header, Quota};
use rocket::{
response::{self, Responder},
Request,
};
mod catcher;
#[derive(Clone, Debug)]
pub enum LimitError {
Error,
GovernedRequest(u64, Quota),
MissingClientIpAddr,
MissingRoute,
MissingRouteName,
}
impl<'r, 'o: 'r> Responder<'r, 'o> for &LimitError {
fn respond_to(self, request: &'r Request<'_>) -> response::Result<'o> {
let mut handler = catcher::too_many_requests_handler(request);
match self {
LimitError::Error => {
handler.set_header(Header::XRateLimitError("rate limiter error"));
}
LimitError::GovernedRequest(wait_time, quota) => {
handler.set_header(Header::RetryAfter(*wait_time));
handler.set_header(Header::XRateLimitLimit(quota.burst_size().get() as u64));
handler.set_header(Header::XRateLimitReset(
quota.burst_size_replenished_in().as_secs(),
));
}
LimitError::MissingClientIpAddr => {
handler.set_header(Header::XRateLimitError(
"application not retrieving client ip",
));
}
LimitError::MissingRoute => {
handler.set_header(Header::XRateLimitError("routing failure"));
}
LimitError::MissingRouteName => {
handler.set_header(Header::XRateLimitError("route without name"));
}
};
Ok(handler)
}
}