mirror of
https://github.com/actix/actix-extras.git
synced 2024-11-27 17:22:57 +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:
parent
7d932cd540
commit
a623c50e9c
@ -3,6 +3,7 @@
|
|||||||
## Unreleased - 2022-xx-xx
|
## Unreleased - 2022-xx-xx
|
||||||
- Implement `Default` for `RateLimiter`.
|
- Implement `Default` for `RateLimiter`.
|
||||||
- `RateLimiter` is marked `#[non_exhaustive]`; use `RateLimiter::default()` instead.
|
- `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.
|
- Minimum supported Rust version (MSRV) is now 1.59 due to transitive `time` dependency.
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ use actix_web::{
|
|||||||
web, Error, HttpResponse,
|
web, Error, HttpResponse,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::Limiter;
|
use crate::{Error as LimitationError, Limiter};
|
||||||
|
|
||||||
/// Rate limit middleware.
|
/// Rate limit middleware.
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
@ -86,12 +86,32 @@ where
|
|||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
let status = limiter.count(key.to_string()).await;
|
let status = limiter.count(key.to_string()).await;
|
||||||
|
|
||||||
if status.is_err() {
|
if let Err(err) = status {
|
||||||
log::warn!("Rate limit exceed error for {}", key);
|
match err {
|
||||||
|
LimitationError::LimitExceeded(_) => {
|
||||||
|
log::warn!("Rate limit exceed error for {}", key);
|
||||||
|
|
||||||
Ok(req.into_response(
|
Ok(req.into_response(
|
||||||
HttpResponse::new(StatusCode::TOO_MANY_REQUESTS).map_into_right_body(),
|
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 {
|
} else {
|
||||||
service
|
service
|
||||||
.call(req)
|
.call(req)
|
||||||
|
Loading…
Reference in New Issue
Block a user