1
0
mirror of https://github.com/actix/actix-extras.git synced 2024-11-23 15:51:06 +01:00

Limitation: display and handle client error (#280)

* feat(limitation): display and handle client error

* feat(limitation): handle other count errors

* feat: add middleware errors catch changes to changelog

Co-authored-by: Rob Ede <robjtede@icloud.com>
This commit is contained in:
Raphael C 2022-08-28 21:49:14 +02:00 committed by GitHub
parent 7d932cd540
commit a623c50e9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 6 deletions

View File

@ -3,6 +3,7 @@
## Unreleased - 2022-xx-xx
- Implement `Default` for `RateLimiter`.
- `RateLimiter` is marked `#[non_exhaustive]`; use `RateLimiter::default()` instead.
- In the middleware errors from the count function are matched and respond with `INTERNAL_SERVER_ERROR` if it's an unexpected error, instead of the default `TOO_MANY_REQUESTS`.
- Minimum supported Rust version (MSRV) is now 1.59 due to transitive `time` dependency.

View File

@ -9,7 +9,7 @@ use actix_web::{
web, Error, HttpResponse,
};
use crate::Limiter;
use crate::{Error as LimitationError, Limiter};
/// Rate limit middleware.
#[derive(Debug, Default)]
@ -86,12 +86,32 @@ where
Box::pin(async move {
let status = limiter.count(key.to_string()).await;
if status.is_err() {
log::warn!("Rate limit exceed error for {}", key);
if let Err(err) = status {
match err {
LimitationError::LimitExceeded(_) => {
log::warn!("Rate limit exceed error for {}", key);
Ok(req.into_response(
HttpResponse::new(StatusCode::TOO_MANY_REQUESTS).map_into_right_body(),
))
Ok(req.into_response(
HttpResponse::new(StatusCode::TOO_MANY_REQUESTS).map_into_right_body(),
))
}
LimitationError::Client(e) => {
log::error!("Client request failed, redis error: {}", e);
Ok(req.into_response(
HttpResponse::new(StatusCode::INTERNAL_SERVER_ERROR)
.map_into_right_body(),
))
}
_ => {
log::error!("Count failed: {}", err);
Ok(req.into_response(
HttpResponse::new(StatusCode::INTERNAL_SERVER_ERROR)
.map_into_right_body(),
))
}
}
} else {
service
.call(req)