From 0eeb28351e3270c5a0e61477cdfa8b429f8bdab2 Mon Sep 17 00:00:00 2001 From: tomcraven Date: Tue, 5 Jan 2021 00:25:09 +0000 Subject: [PATCH 1/6] Update mod.rs --- src/stores/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/mod.rs b/src/stores/mod.rs index ff2b21f..3fd6351 100644 --- a/src/stores/mod.rs +++ b/src/stores/mod.rs @@ -79,7 +79,7 @@ //! //! The above example is not thread-safe and does not implement key expiration! It's just for demonstration purposes. -#[cfg(feature = "default")] +#[cfg(feature = "memory")] pub mod memory; #[cfg(feature = "redis-store")] From a013ece848fabb5e71c863071563e51f4047ebf8 Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Tue, 12 Jan 2021 23:37:50 +0800 Subject: [PATCH 2/6] Update Cargo.toml --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7d23a04..34c0db0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,8 +24,8 @@ memcached = ["r2d2-memcache", "backoff"] [dependencies] log = "0.4.11" -actix-web = {version = "3.3.2"} -actix-http = {version = "2.2.0", features=["actors"]} +actix-web = {version = "4.0.0-beta.1"} +actix-http = {version = "3.0.0-beta.1", features=["actors"]} actix = "0.10" futures = "0.3.8" failure = "0.1.8" @@ -37,6 +37,6 @@ backoff = {version = "0.2.1", optional = true} r2d2-memcache = { version = "0.5", optional = true } [dev-dependencies] -actix-rt = "1.1.1" +actix-rt = "2.0.0-beta.2" env_logger = "0.8.2" version-sync = "0.9.1" From 968d661ade9c2dbe950665b483eaa61ac3fe0216 Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Tue, 12 Jan 2021 23:43:44 +0800 Subject: [PATCH 3/6] Update middleware.rs --- src/middleware.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/middleware.rs b/src/middleware.rs index 59f38e9..be9b7b1 100644 --- a/src/middleware.rs +++ b/src/middleware.rs @@ -101,11 +101,10 @@ impl Transform for RateLimiter where T: Handler + Send + Sync + 'static, T::Context: ToEnvelope, - S: Service, Error = AWError> + 'static, + S: Service, Error = AWError> + 'static, S::Future: 'static, B: 'static, { - type Request = ServiceRequest; type Response = ServiceResponse; type Error = S::Error; type InitError = (); @@ -140,12 +139,11 @@ where impl Service for RateLimitMiddleware where T: Handler + 'static, - S: Service, Error = AWError> + 'static, + S: Service, Error = AWError> + 'static, S::Future: 'static, B: 'static, T::Context: ToEnvelope, { - type Request = ServiceRequest; type Response = ServiceResponse; type Error = S::Error; type Future = Pin>>>; From 093b56b88f20c718bb2d5b5973e28a2e7a7b6137 Mon Sep 17 00:00:00 2001 From: Steve Fan <29133953+stevefan1999-personal@users.noreply.github.com> Date: Tue, 12 Jan 2021 23:52:11 +0800 Subject: [PATCH 4/6] workaround by wrapping mailbox error into 500 --- src/middleware.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/middleware.rs b/src/middleware.rs index be9b7b1..5b5d0ba 100644 --- a/src/middleware.rs +++ b/src/middleware.rs @@ -3,6 +3,7 @@ use actix::dev::*; use actix_web::{ dev::{Service, ServiceRequest, ServiceResponse, Transform}, error::Error as AWError, + error::ErrorInternalServerError, http::{HeaderName, HeaderValue}, HttpResponse, }; @@ -97,7 +98,7 @@ where } } -impl Transform for RateLimiter +impl Transform for RateLimiter where T: Handler + Send + Sync + 'static, T::Context: ToEnvelope, @@ -136,7 +137,7 @@ where identifier: Rc Result + 'static>>, } -impl Service for RateLimitMiddleware +impl Service for RateLimitMiddleware where T: Handler + 'static, S: Service, Error = AWError> + 'static, @@ -162,7 +163,7 @@ where let identifier: String = (identifier)(&req)?; let remaining: ActorResponse = store .send(ActorMessage::Get(String::from(&identifier))) - .await?; + .await.map_err(ErrorInternalServerError)?; match remaining { ActorResponse::Get(opt) => { let opt = opt.await?; @@ -170,7 +171,7 @@ where // Existing entry in store let expiry = store .send(ActorMessage::Expire(String::from(&identifier))) - .await?; + .await.map_err(ErrorInternalServerError)?; let reset: Duration = match expiry { ActorResponse::Expire(dur) => dur.await?, _ => unreachable!(), @@ -190,7 +191,7 @@ where key: identifier, value: 1, }) - .await?; + .await.map_err(ErrorInternalServerError)?; let updated_value: usize = match res { ActorResponse::Update(c) => c.await?, _ => unreachable!(), @@ -223,7 +224,7 @@ where value: current_value, expiry: interval, }) - .await?; + .await.map_err(ErrorInternalServerError)?; match res { ActorResponse::Set(c) => c.await?, _ => unreachable!(), From 0ddc2fca4d874007179e640b6b90fdbf4ae2d371 Mon Sep 17 00:00:00 2001 From: Tom Craven Date: Sat, 16 Jan 2021 01:15:25 +0000 Subject: [PATCH 5/6] update --- Cargo.toml | 4 ++-- src/middleware.rs | 56 +++++++++++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7d23a04..c51f3ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,9 +24,9 @@ memcached = ["r2d2-memcache", "backoff"] [dependencies] log = "0.4.11" -actix-web = {version = "3.3.2"} +actix-web = {version = "4.0.0-beta.1"} actix-http = {version = "2.2.0", features=["actors"]} -actix = "0.10" +actix = { git = "https://github.com/actix/actix" } futures = "0.3.8" failure = "0.1.8" diff --git a/src/middleware.rs b/src/middleware.rs index 59f38e9..8075c28 100644 --- a/src/middleware.rs +++ b/src/middleware.rs @@ -97,15 +97,14 @@ where } } -impl Transform for RateLimiter +impl Transform for RateLimiter where T: Handler + Send + Sync + 'static, T::Context: ToEnvelope, - S: Service, Error = AWError> + 'static, + S: Service, Error = AWError> + 'static, S::Future: 'static, B: 'static, { - type Request = ServiceRequest; type Response = ServiceResponse; type Error = S::Error; type InitError = (); @@ -137,15 +136,14 @@ where identifier: Rc Result + 'static>>, } -impl Service for RateLimitMiddleware +impl Service for RateLimitMiddleware where T: Handler + 'static, - S: Service, Error = AWError> + 'static, + S: Service, Error = AWError> + 'static, S::Future: 'static, B: 'static, T::Context: ToEnvelope, { - type Request = ServiceRequest; type Response = ServiceResponse; type Error = S::Error; type Future = Pin>>>; @@ -162,20 +160,25 @@ where let identifier = self.identifier.clone(); Box::pin(async move { let identifier: String = (identifier)(&req)?; - let remaining: ActorResponse = store + let remaining: ActorResponse = match store .send(ActorMessage::Get(String::from(&identifier))) - .await?; + .await { + Ok(r) => r, + Err(_) => panic!("doh") + }; match remaining { ActorResponse::Get(opt) => { let opt = opt.await?; if let Some(c) = opt { // Existing entry in store - let expiry = store + let reset: Duration = match store .send(ActorMessage::Expire(String::from(&identifier))) - .await?; - let reset: Duration = match expiry { - ActorResponse::Expire(dur) => dur.await?, - _ => unreachable!(), + .await { + Ok(a) => match a { + ActorResponse::Expire(dur) => dur.await?, + _ => unreachable!(), + } + Err(_) => panic!("doh") }; if c == 0 { info!("Limit exceeded for client: {}", &identifier); @@ -187,16 +190,19 @@ where Err(response.into()) } else { // Decrement value - let res: ActorResponse = store + let updated_value: usize = match store .send(ActorMessage::Update { key: identifier, value: 1, }) - .await?; - let updated_value: usize = match res { - ActorResponse::Update(c) => c.await?, - _ => unreachable!(), + .await { + Ok(res) => match res { + ActorResponse::Update(c) => c.await?, + _ => unreachable!(), + } + Err(_) => panic!("doh") }; + // Execute the request let fut = srv.call(req); let mut res = fut.await?; @@ -219,17 +225,19 @@ where } else { // New client, create entry in store let current_value = max_requests - 1; - let res = store + match store .send(ActorMessage::Set { key: String::from(&identifier), value: current_value, expiry: interval, }) - .await?; - match res { - ActorResponse::Set(c) => c.await?, - _ => unreachable!(), - } + .await { + Ok(res) => match res { + ActorResponse::Set(c) => c.await?, + _ => unreachable!(), + } + Err(_) => panic!("doh") + }; let fut = srv.call(req); let mut res = fut.await?; let headers = res.headers_mut(); From f8ebc7e92be375e9caab0ce09fe92412cf85587b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Bene=C5=A1?= Date: Wed, 27 Jan 2021 00:11:29 +0100 Subject: [PATCH 6/6] update Cargo.toml --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 34c0db0..bae3c92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ memcached = ["r2d2-memcache", "backoff"] log = "0.4.11" actix-web = {version = "4.0.0-beta.1"} actix-http = {version = "3.0.0-beta.1", features=["actors"]} -actix = "0.10" +actix = "0.11.0-beta.1" futures = "0.3.8" failure = "0.1.8"