From 1edfa99a7fd8ca54e8dcb9a8c1119e4d5d1205ca Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Sun, 29 Mar 2020 10:02:42 +0530 Subject: [PATCH 01/28] ratelimiting (in progress) --- .../nms/imi/web/HttpInterceptor.java | 15 +++++++++++++++ .../META-INF/motech/applicationContext.xml | 3 +++ 2 files changed, 18 insertions(+) create mode 100644 imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java new file mode 100644 index 000000000..8dd281f3c --- /dev/null +++ b/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java @@ -0,0 +1,15 @@ +package org.motechproject.nms.imi.web; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class HttpInterceptor implements HandlerInterceptor { + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, Object handler) throws Exception { + System.out.println("Inside pre handle"); + return true; + } + + } diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index bd11d1aa2..7cca9eb5d 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -10,6 +10,9 @@ + + + From 46e91341d2a71d73c10cf3eb49b7e88b0aae79db Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Sun, 29 Mar 2020 10:18:02 +0530 Subject: [PATCH 02/28] ratelimiting (in progress) --- .../motechproject/nms/imi/web/HttpInterceptor.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java index 8dd281f3c..0c8d5f696 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java @@ -12,4 +12,17 @@ public boolean preHandle(HttpServletRequest request, return true; } + @Override + public void postHandle(HttpServletRequest request, + HttpServletResponse response) throws Exception { + System.out.println("Inside post handle"); + } + + @Override + public void afterCompletion(HttpServletRequest request, + HttpServletResponse response, Exception exception) + throws Exception { + System.out.println("Inside after completion"); + } + } From 7cbd4bd1c6bdb5c5ae9ac2481db22ab4e9829d90 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Sun, 29 Mar 2020 10:20:02 +0530 Subject: [PATCH 03/28] ratelimiting (in progress) --- .../java/org/motechproject/nms/imi/web/HttpInterceptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java index 0c8d5f696..09564a225 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java @@ -20,7 +20,7 @@ public void postHandle(HttpServletRequest request, @Override public void afterCompletion(HttpServletRequest request, - HttpServletResponse response, Exception exception) + HttpServletResponse response, Object handler, Exception exception) throws Exception { System.out.println("Inside after completion"); } From 6fb01962b0c448b60a3826b7cb375dd6200c2daf Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Sun, 29 Mar 2020 10:22:17 +0530 Subject: [PATCH 04/28] ratelimiting (in progress) --- .../java/org/motechproject/nms/imi/web/HttpInterceptor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java index 09564a225..cae4ecfc6 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java @@ -3,6 +3,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.web.servlet.ModelAndView; public class HttpInterceptor implements HandlerInterceptor { @Override @@ -14,7 +15,8 @@ public boolean preHandle(HttpServletRequest request, @Override public void postHandle(HttpServletRequest request, - HttpServletResponse response) throws Exception { + HttpServletResponse response, Object handler, + ModelAndView modelAndView) throws Exception { System.out.println("Inside post handle"); } From 55488615f5a254763086e6dbce98f955df3efd63 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 00:54:45 +0530 Subject: [PATCH 05/28] ratelimiting (in progress) --- imi/pom.xml | 6 +++ .../nms/imi/web/HttpInterceptor.java | 30 -------------- .../nms/imi/web/RateLimitInterceptor.java | 41 +++++++++++++++++++ .../motechproject/nms/imi/web/WebConfig.java | 32 +++++++++++++++ .../META-INF/motech/applicationContext.xml | 3 -- 5 files changed, 79 insertions(+), 33 deletions(-) delete mode 100644 imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java create mode 100644 imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java create mode 100644 imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java diff --git a/imi/pom.xml b/imi/pom.xml index c75c8d9d8..510ddb0bb 100644 --- a/imi/pom.xml +++ b/imi/pom.xml @@ -35,6 +35,12 @@ ${project.version} + + com.github.vladimir-bukhtoyarov + bucket4j-core + 4.9.0 + + org.motechproject.nms diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java deleted file mode 100644 index cae4ecfc6..000000000 --- a/imi/src/main/java/org/motechproject/nms/imi/web/HttpInterceptor.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.motechproject.nms.imi.web; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.springframework.web.servlet.ModelAndView; - -public class HttpInterceptor implements HandlerInterceptor { - @Override - public boolean preHandle(HttpServletRequest request, - HttpServletResponse response, Object handler) throws Exception { - System.out.println("Inside pre handle"); - return true; - } - - @Override - public void postHandle(HttpServletRequest request, - HttpServletResponse response, Object handler, - ModelAndView modelAndView) throws Exception { - System.out.println("Inside post handle"); - } - - @Override - public void afterCompletion(HttpServletRequest request, - HttpServletResponse response, Object handler, Exception exception) - throws Exception { - System.out.println("Inside after completion"); - } - - } diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java new file mode 100644 index 000000000..9c46ea0cb --- /dev/null +++ b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java @@ -0,0 +1,41 @@ +package org.motechproject.nms.imi.web; +import io.github.bucket4j.Bucket; +import io.github.bucket4j.ConsumptionProbe; +import org.springframework.web.servlet.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.web.servlet.ModelAndView; + +import java.util.concurrent.TimeUnit; + +public class RateLimitInterceptor implements HandlerInterceptorAdapter { + + private final Bucket bucket; + + private final int numTokens; + + public RateLimitInterceptor(Bucket bucket, int numTokens) { + this.bucket = bucket; + this.numTokens = numTokens; + } + + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, Object handler) throws Exception { + System.out.println("Inside pre handle"); + ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(this.numTokens); + if (probe.isConsumed()) { + response.addHeader("X-Rate-Limit-Remaining", + Long.toString(probe.getRemainingTokens())); + return true; + } + + response.setStatus(429); // 429 + response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", + Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); + + return false; + } + + } diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java new file mode 100644 index 000000000..f5d8c8beb --- /dev/null +++ b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java @@ -0,0 +1,32 @@ +package org.motechproject.nms.imi.web; + + +import io.github.bucket4j.Bandwidth; +import io.github.bucket4j.Bucket; +import io.github.bucket4j.Bucket4j; +import io.github.bucket4j.Refill; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import java.time.Duration; + +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = { "org.motechproject.nms.imi.web"}) +public class WebConfig extends WebMvcConfigurerAdapter { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + Refill refill = Refill.intervally(1, Duration.ofMinutes(1)); + Bandwidth limit = Bandwidth.classic(1, refill).withInitialTokens(1); + Bucket bucket = Bucket4j.builder().addLimit(limit).build(); + registry.addInterceptor(new RateLimitInterceptor(bucket, 1)).addPathPatterns("/generateTargetFile"); + + refill = Refill.intervally(2, Duration.ofMinutes(1)); + limit = Bandwidth.classic(2, refill); + bucket = Bucket4j.builder().addLimit(limit).build(); + registry.addInterceptor(new RateLimitInterceptor(bucket, 1)) + .addPathPatterns("/cdrFileNotification"); + } +} diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index 7cca9eb5d..bd11d1aa2 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -10,9 +10,6 @@ - - - From bd255a2877e2df8b3162b6663737ff441e6e2ea1 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 01:05:50 +0530 Subject: [PATCH 06/28] ratelimiting (in progress) --- .../org/motechproject/nms/imi/web/RateLimitInterceptor.java | 2 +- imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java index 9c46ea0cb..35aabb497 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java @@ -1,7 +1,7 @@ package org.motechproject.nms.imi.web; import io.github.bucket4j.Bucket; import io.github.bucket4j.ConsumptionProbe; -import org.springframework.web.servlet.HandlerInterceptorAdapter; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java index f5d8c8beb..996be7bb1 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java @@ -7,7 +7,10 @@ import io.github.bucket4j.Refill; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; + import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.time.Duration; From af4c28faf90242e9e4cd617fac674413791eeff6 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 01:11:04 +0530 Subject: [PATCH 07/28] ratelimiting (in progress) --- .../org/motechproject/nms/imi/web/RateLimitInterceptor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java index 35aabb497..bc0719424 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java @@ -1,7 +1,7 @@ package org.motechproject.nms.imi.web; import io.github.bucket4j.Bucket; import io.github.bucket4j.ConsumptionProbe; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -9,7 +9,7 @@ import java.util.concurrent.TimeUnit; -public class RateLimitInterceptor implements HandlerInterceptorAdapter { +public class RateLimitInterceptor implements HandlerInterceptor { private final Bucket bucket; From 3b059b05bc2e3402367cabb3e715255fa827c34d Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 01:13:59 +0530 Subject: [PATCH 08/28] ratelimiting (in progress) --- .../nms/imi/web/RateLimitInterceptor.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java index bc0719424..442c4fcbd 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java @@ -38,4 +38,15 @@ public boolean preHandle(HttpServletRequest request, return false; } + @Override + public void postHandle(HttpServletRequest req, HttpServletResponse res, + Object handler, ModelAndView model) throws Exception { + } + + // Called after rendering the view + @Override + public void afterCompletion(HttpServletRequest req, HttpServletResponse res, + Object handler, Exception ex) throws Exception { + } + } From 6f3d83abaf436a997c54874a96df4dc1af355ebf Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 02:46:24 +0530 Subject: [PATCH 09/28] ratelimiting (in progress) --- imi/pom.xml | 10 ++--- .../nms/imi/web/RateLimitInterceptor.java | 45 ++++++++++--------- .../motechproject/nms/imi/web/WebConfig.java | 31 ++++++------- 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/imi/pom.xml b/imi/pom.xml index 510ddb0bb..6f835b701 100644 --- a/imi/pom.xml +++ b/imi/pom.xml @@ -35,11 +35,11 @@ ${project.version} - - com.github.vladimir-bukhtoyarov - bucket4j-core - 4.9.0 - + + + + + diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java index 442c4fcbd..739ef16b4 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java @@ -1,6 +1,6 @@ package org.motechproject.nms.imi.web; -import io.github.bucket4j.Bucket; -import io.github.bucket4j.ConsumptionProbe; +//import io.github.bucket4j.Bucket; +//import io.github.bucket4j.ConsumptionProbe; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; @@ -10,32 +10,33 @@ import java.util.concurrent.TimeUnit; public class RateLimitInterceptor implements HandlerInterceptor { +// +// private final Bucket bucket; +// +// private final int numTokens; - private final Bucket bucket; - - private final int numTokens; - - public RateLimitInterceptor(Bucket bucket, int numTokens) { - this.bucket = bucket; - this.numTokens = numTokens; - } +// public RateLimitInterceptor(Bucket bucket, int numTokens) { +// this.bucket = bucket; +// this.numTokens = numTokens; +// } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Inside pre handle"); - ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(this.numTokens); - if (probe.isConsumed()) { - response.addHeader("X-Rate-Limit-Remaining", - Long.toString(probe.getRemainingTokens())); - return true; - } - - response.setStatus(429); // 429 - response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", - Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); - - return false; +// ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(this.numTokens); +// if (probe.isConsumed()) { +// response.addHeader("X-Rate-Limit-Remaining", +// Long.toString(probe.getRemainingTokens())); +// return true; +// } +// +// response.setStatus(429); // 429 +// response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", +// Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); +// +// return false; + return true; } @Override diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java index 996be7bb1..b4ea4c575 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java @@ -1,10 +1,10 @@ package org.motechproject.nms.imi.web; -import io.github.bucket4j.Bandwidth; -import io.github.bucket4j.Bucket; -import io.github.bucket4j.Bucket4j; -import io.github.bucket4j.Refill; +//import io.github.bucket4j.Bandwidth; +//import io.github.bucket4j.Bucket; +//import io.github.bucket4j.Bucket4j; +//import io.github.bucket4j.Refill; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -12,7 +12,7 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import java.time.Duration; +//import java.time.Duration; @Configuration @EnableWebMvc @@ -21,15 +21,16 @@ public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { - Refill refill = Refill.intervally(1, Duration.ofMinutes(1)); - Bandwidth limit = Bandwidth.classic(1, refill).withInitialTokens(1); - Bucket bucket = Bucket4j.builder().addLimit(limit).build(); - registry.addInterceptor(new RateLimitInterceptor(bucket, 1)).addPathPatterns("/generateTargetFile"); - - refill = Refill.intervally(2, Duration.ofMinutes(1)); - limit = Bandwidth.classic(2, refill); - bucket = Bucket4j.builder().addLimit(limit).build(); - registry.addInterceptor(new RateLimitInterceptor(bucket, 1)) - .addPathPatterns("/cdrFileNotification"); +// Refill refill = Refill.intervally(1, Duration.ofMinutes(1)); +// Bandwidth limit = Bandwidth.classic(1, refill).withInitialTokens(1); +// Bucket bucket = Bucket4j.builder().addLimit(limit).build(); +// registry.addInterceptor(new RateLimitInterceptor(bucket, 1)).addPathPatterns("/generateTargetFile"); +// +// refill = Refill.intervally(2, Duration.ofMinutes(1)); +// limit = Bandwidth.classic(2, refill); +// bucket = Bucket4j.builder().addLimit(limit).build(); +// registry.addInterceptor(new RateLimitInterceptor(bucket, 1)) +// .addPathPatterns("/cdrFileNotification"); + registry.addInterceptor(new RateLimitInterceptor()); } } From 97f37fb2852d4af69cb17b9a59c63f12e3fa13fe Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 03:58:15 +0530 Subject: [PATCH 10/28] ratelimiting (in progress) --- imi/pom.xml | 6 --- .../nms/imi/web/RateLimitInterceptor.java | 43 +++++++++---------- .../motechproject/nms/imi/web/WebConfig.java | 38 +++++++--------- pom.xml | 5 +++ 4 files changed, 42 insertions(+), 50 deletions(-) diff --git a/imi/pom.xml b/imi/pom.xml index 6f835b701..c75c8d9d8 100644 --- a/imi/pom.xml +++ b/imi/pom.xml @@ -35,12 +35,6 @@ ${project.version} - - - - - - org.motechproject.nms diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java index 739ef16b4..eebe4ae0a 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java @@ -1,6 +1,6 @@ package org.motechproject.nms.imi.web; -//import io.github.bucket4j.Bucket; -//import io.github.bucket4j.ConsumptionProbe; +import io.github.bucket4j.Bucket; +import io.github.bucket4j.ConsumptionProbe; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; @@ -11,32 +11,31 @@ public class RateLimitInterceptor implements HandlerInterceptor { // -// private final Bucket bucket; -// -// private final int numTokens; + private final Bucket bucket; + + private final int numTokens; -// public RateLimitInterceptor(Bucket bucket, int numTokens) { -// this.bucket = bucket; -// this.numTokens = numTokens; -// } + public RateLimitInterceptor(Bucket bucket, int numTokens) { + this.bucket = bucket; + this.numTokens = numTokens; + } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Inside pre handle"); -// ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(this.numTokens); -// if (probe.isConsumed()) { -// response.addHeader("X-Rate-Limit-Remaining", -// Long.toString(probe.getRemainingTokens())); -// return true; -// } -// -// response.setStatus(429); // 429 -// response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", -// Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); -// -// return false; - return true; + ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(this.numTokens); + if (probe.isConsumed()) { + response.addHeader("X-Rate-Limit-Remaining", + Long.toString(probe.getRemainingTokens())); + return true; + } + + response.setStatus(429); // 429 + response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", + Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); + + return false; } @Override diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java index b4ea4c575..322383a03 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java @@ -1,36 +1,30 @@ package org.motechproject.nms.imi.web; - -//import io.github.bucket4j.Bandwidth; -//import io.github.bucket4j.Bucket; -//import io.github.bucket4j.Bucket4j; -//import io.github.bucket4j.Refill; -import org.springframework.context.annotation.ComponentScan; +import io.github.bucket4j.Bandwidth; +import io.github.bucket4j.Bucket; +import io.github.bucket4j.Bucket4j; +import io.github.bucket4j.Refill; import org.springframework.context.annotation.Configuration; - import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -//import java.time.Duration; +import java.time.Duration; -@Configuration @EnableWebMvc -@ComponentScan(basePackages = { "org.motechproject.nms.imi.web"}) +@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { -// Refill refill = Refill.intervally(1, Duration.ofMinutes(1)); -// Bandwidth limit = Bandwidth.classic(1, refill).withInitialTokens(1); -// Bucket bucket = Bucket4j.builder().addLimit(limit).build(); -// registry.addInterceptor(new RateLimitInterceptor(bucket, 1)).addPathPatterns("/generateTargetFile"); -// -// refill = Refill.intervally(2, Duration.ofMinutes(1)); -// limit = Bandwidth.classic(2, refill); -// bucket = Bucket4j.builder().addLimit(limit).build(); -// registry.addInterceptor(new RateLimitInterceptor(bucket, 1)) -// .addPathPatterns("/cdrFileNotification"); - registry.addInterceptor(new RateLimitInterceptor()); - } + Refill refill = Refill.intervally(1, Duration.ofMinutes(1)); + Bandwidth limit = Bandwidth.classic(1, refill).withInitialTokens(1); + Bucket bucket = Bucket4j.builder().addLimit(limit).build(); + registry.addInterceptor(new RateLimitInterceptor(bucket, 1)).addPathPatterns("/generateTargetFile"); + + refill = Refill.intervally(2, Duration.ofMinutes(1)); + limit = Bandwidth.classic(2, refill); + bucket = Bucket4j.builder().addLimit(limit).build(); + registry.addInterceptor(new RateLimitInterceptor(bucket, 1)) + .addPathPatterns("/cdrFileNotification"); } diff --git a/pom.xml b/pom.xml index db4edf6c1..6cbaa0a89 100644 --- a/pom.xml +++ b/pom.xml @@ -113,6 +113,11 @@ org.slf4j jcl-over-slf4j + + com.github.vladimir-bukhtoyarov + bucket4j-core + 4.9.0 + org.slf4j slf4j-log4j12 From f157b7af8fe223dbe22ac2408ff7fb522e4b45d4 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 04:02:49 +0530 Subject: [PATCH 11/28] ratelimiting (in progress) --- imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java index 322383a03..2b12fa0a9 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java @@ -27,4 +27,5 @@ public void addInterceptors(InterceptorRegistry registry) { bucket = Bucket4j.builder().addLimit(limit).build(); registry.addInterceptor(new RateLimitInterceptor(bucket, 1)) .addPathPatterns("/cdrFileNotification"); + } } From 2b94a99735312b5911f6446d9126bcb383ebc2b4 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 04:09:09 +0530 Subject: [PATCH 12/28] ratelimiting (in progress) --- .../main/java/org/motechproject/nms/imi/web/WebConfig.java | 5 +---- .../main/resources/META-INF/motech/applicationContext.xml | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java index 2b12fa0a9..eafa1a53c 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java @@ -4,15 +4,12 @@ import io.github.bucket4j.Bucket; import io.github.bucket4j.Bucket4j; import io.github.bucket4j.Refill; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; + import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.time.Duration; -@EnableWebMvc -@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index bd11d1aa2..b3d8eaed8 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -32,5 +32,6 @@ + From a97bc7128a0f41d49ebe9f89259c087f0f78e82f Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 04:21:50 +0530 Subject: [PATCH 13/28] ratelimiting (in progress) --- imi/src/main/resources/META-INF/motech/applicationContext.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index b3d8eaed8..bd11d1aa2 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -32,6 +32,5 @@ - From a64dfc6b5dbdb25918a8a9a5e82ad5ab2e8e1b29 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 04:33:37 +0530 Subject: [PATCH 14/28] ratelimiting (in progress) --- .../nms/imi/web/RateLimitInterceptor.java | 45 ++++++++++--------- .../motechproject/nms/imi/web/WebConfig.java | 29 ++++++------ 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java index eebe4ae0a..8c3ee7651 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java @@ -1,41 +1,42 @@ package org.motechproject.nms.imi.web; -import io.github.bucket4j.Bucket; -import io.github.bucket4j.ConsumptionProbe; +//import io.github.bucket4j.Bucket; +//import io.github.bucket4j.ConsumptionProbe; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; -import java.util.concurrent.TimeUnit; +//import java.util.concurrent.TimeUnit; public class RateLimitInterceptor implements HandlerInterceptor { // - private final Bucket bucket; - - private final int numTokens; +// private final Bucket bucket; +// +// private final int numTokens; - public RateLimitInterceptor(Bucket bucket, int numTokens) { - this.bucket = bucket; - this.numTokens = numTokens; - } +// public RateLimitInterceptor(Bucket bucket, int numTokens) { +// this.bucket = bucket; +// this.numTokens = numTokens; +// } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Inside pre handle"); - ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(this.numTokens); - if (probe.isConsumed()) { - response.addHeader("X-Rate-Limit-Remaining", - Long.toString(probe.getRemainingTokens())); - return true; - } - - response.setStatus(429); // 429 - response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", - Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); - - return false; +// ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(this.numTokens); +// if (probe.isConsumed()) { +// response.addHeader("X-Rate-Limit-Remaining", +// Long.toString(probe.getRemainingTokens())); +// return true; +// } +// +// response.setStatus(429); // 429 +// response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", +// Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); +// +// return false; + return true; } @Override diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java index eafa1a53c..7d80a22ce 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java @@ -1,28 +1,29 @@ package org.motechproject.nms.imi.web; -import io.github.bucket4j.Bandwidth; -import io.github.bucket4j.Bucket; -import io.github.bucket4j.Bucket4j; -import io.github.bucket4j.Refill; +//import io.github.bucket4j.Bandwidth; +//import io.github.bucket4j.Bucket; +//import io.github.bucket4j.Bucket4j; +//import io.github.bucket4j.Refill; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import java.time.Duration; +//import java.time.Duration; public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { - Refill refill = Refill.intervally(1, Duration.ofMinutes(1)); - Bandwidth limit = Bandwidth.classic(1, refill).withInitialTokens(1); - Bucket bucket = Bucket4j.builder().addLimit(limit).build(); - registry.addInterceptor(new RateLimitInterceptor(bucket, 1)).addPathPatterns("/generateTargetFile"); +// Refill refill = Refill.intervally(1, Duration.ofMinutes(1)); +// Bandwidth limit = Bandwidth.classic(1, refill).withInitialTokens(1); +// Bucket bucket = Bucket4j.builder().addLimit(limit).build(); + registry.addInterceptor(new RateLimitInterceptor()).addPathPatterns("/generateTargetFile"); +// +// refill = Refill.intervally(2, Duration.ofMinutes(1)); +// limit = Bandwidth.classic(2, refill); +// bucket = Bucket4j.builder().addLimit(limit).build(); +// registry.addInterceptor(new RateLimitInterceptor(bucket, 1)) +// .addPathPatterns("/cdrFileNotification"); - refill = Refill.intervally(2, Duration.ofMinutes(1)); - limit = Bandwidth.classic(2, refill); - bucket = Bucket4j.builder().addLimit(limit).build(); - registry.addInterceptor(new RateLimitInterceptor(bucket, 1)) - .addPathPatterns("/cdrFileNotification"); } } From a309580594cd678a2dde8910127934c2aafd3541 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 04:42:11 +0530 Subject: [PATCH 15/28] ratelimiting (in progress) --- imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java index 7d80a22ce..b13be217f 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java @@ -7,9 +7,10 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; //import java.time.Duration; - +@EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override From 1b3e4c76b11fcafbc683e0337b15b1c306b6afc1 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 04:50:12 +0530 Subject: [PATCH 16/28] ratelimiting (in progress) --- .../motechproject/nms/imi/web/WebConfig.java | 30 ------------------- .../META-INF/motech/applicationContext.xml | 4 ++- 2 files changed, 3 insertions(+), 31 deletions(-) delete mode 100644 imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java b/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java deleted file mode 100644 index b13be217f..000000000 --- a/imi/src/main/java/org/motechproject/nms/imi/web/WebConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.motechproject.nms.imi.web; - -//import io.github.bucket4j.Bandwidth; -//import io.github.bucket4j.Bucket; -//import io.github.bucket4j.Bucket4j; -//import io.github.bucket4j.Refill; - -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -//import java.time.Duration; -@EnableWebMvc -public class WebConfig extends WebMvcConfigurerAdapter { - - @Override - public void addInterceptors(InterceptorRegistry registry) { -// Refill refill = Refill.intervally(1, Duration.ofMinutes(1)); -// Bandwidth limit = Bandwidth.classic(1, refill).withInitialTokens(1); -// Bucket bucket = Bucket4j.builder().addLimit(limit).build(); - registry.addInterceptor(new RateLimitInterceptor()).addPathPatterns("/generateTargetFile"); -// -// refill = Refill.intervally(2, Duration.ofMinutes(1)); -// limit = Bandwidth.classic(2, refill); -// bucket = Bucket4j.builder().addLimit(limit).build(); -// registry.addInterceptor(new RateLimitInterceptor(bucket, 1)) -// .addPathPatterns("/cdrFileNotification"); - - } -} diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index bd11d1aa2..5fa1aab70 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -10,7 +10,9 @@ - + + + From fe3cd7a9bba3e95de006b9bfef0e07e6a0350dc5 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 05:12:47 +0530 Subject: [PATCH 17/28] ratelimiting (in progress) --- .../nms/imi/web/RateLimitInterceptor.java | 42 +++++++++---------- .../META-INF/motech/applicationContext.xml | 3 +- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java index 8c3ee7651..f98d2f099 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java @@ -1,42 +1,40 @@ package org.motechproject.nms.imi.web; -//import io.github.bucket4j.Bucket; -//import io.github.bucket4j.ConsumptionProbe; +import io.github.bucket4j.*; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; -//import java.util.concurrent.TimeUnit; +import java.time.Duration; +import java.util.concurrent.TimeUnit; public class RateLimitInterceptor implements HandlerInterceptor { // -// private final Bucket bucket; -// -// private final int numTokens; + private final Bucket bucket; -// public RateLimitInterceptor(Bucket bucket, int numTokens) { -// this.bucket = bucket; -// this.numTokens = numTokens; -// } + public RateLimitInterceptor(int capacity) { + Refill refill = Refill.intervally(capacity, Duration.ofMinutes(1)); + Bandwidth limit = Bandwidth.classic(capacity, refill); + this.bucket = Bucket4j.builder().addLimit(limit).build(); + } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Inside pre handle"); -// ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(this.numTokens); -// if (probe.isConsumed()) { -// response.addHeader("X-Rate-Limit-Remaining", -// Long.toString(probe.getRemainingTokens())); -// return true; -// } + ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(1); + if (probe.isConsumed()) { + response.addHeader("X-Rate-Limit-Remaining", + Long.toString(probe.getRemainingTokens())); + return true; + } // -// response.setStatus(429); // 429 -// response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", -// Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); -// -// return false; - return true; + response.setStatus(429); // 429 + response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", + Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); + + return false; } @Override diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index 5fa1aab70..83fcebcc2 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -11,7 +11,8 @@ - + + From 0f980e2dfbb7dcfb6db343615c836ef778aedd0f Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 05:17:43 +0530 Subject: [PATCH 18/28] ratelimiting (in progress) --- imi/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/imi/pom.xml b/imi/pom.xml index c75c8d9d8..7921a4806 100644 --- a/imi/pom.xml +++ b/imi/pom.xml @@ -100,6 +100,7 @@ org.motechproject.nms.region.service, org.motechproject.nms.region.utils, org.datanucleus.enhancement, + io.github.bucket4j.*, org.springframework.validation.beanvalidation, * From e791ae7a1d013aa28f299e688b0c45e61097ddb5 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 30 Mar 2020 10:13:35 +0530 Subject: [PATCH 19/28] ratelimiting (in progress) --- imi/pom.xml | 6 +++++- pom.xml | 5 ----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/imi/pom.xml b/imi/pom.xml index 7921a4806..e7dc499b6 100644 --- a/imi/pom.xml +++ b/imi/pom.xml @@ -41,6 +41,11 @@ kilkari ${project.version} + + com.github.vladimir-bukhtoyarov + bucket4j-core + 4.9.0 + @@ -100,7 +105,6 @@ org.motechproject.nms.region.service, org.motechproject.nms.region.utils, org.datanucleus.enhancement, - io.github.bucket4j.*, org.springframework.validation.beanvalidation, * diff --git a/pom.xml b/pom.xml index 6cbaa0a89..db4edf6c1 100644 --- a/pom.xml +++ b/pom.xml @@ -113,11 +113,6 @@ org.slf4j jcl-over-slf4j - - com.github.vladimir-bukhtoyarov - bucket4j-core - 4.9.0 - org.slf4j slf4j-log4j12 From f2c4b390b4e58075e69c8187b7cbc78376bb81c9 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Sun, 5 Apr 2020 02:18:56 +0530 Subject: [PATCH 20/28] bucket4j implementation for imi (in progress) --- imi/pom.xml | 2 +- pom.xml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/imi/pom.xml b/imi/pom.xml index e7dc499b6..a9869b41e 100644 --- a/imi/pom.xml +++ b/imi/pom.xml @@ -44,7 +44,7 @@ com.github.vladimir-bukhtoyarov bucket4j-core - 4.9.0 + 4.1.1 diff --git a/pom.xml b/pom.xml index db4edf6c1..20e5409fe 100644 --- a/pom.xml +++ b/pom.xml @@ -661,6 +661,11 @@ + + com.github.vladimir-bukhtoyarov + bucket4j-core + 4.1.1 + org.motechproject motech-platform-osgi-extender-fragment From 529505f94f7b93f4c46a823035f7e72fa9c619ff Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Sun, 12 Apr 2020 19:35:35 +0530 Subject: [PATCH 21/28] bucket4j implementation for imi and other modules (in progress) --- api/pom.xml | 6 +++ .../nms/api/web/RateLimitInterceptor.java | 51 +++++++++++++++++++ .../META-INF/motech/applicationContext.xml | 28 ++++++++++ imi/pom.xml | 12 +++-- .../nms/imi/web/RateLimitInterceptor.java | 1 - .../META-INF/motech/applicationContext.xml | 8 +++ pom.xml | 4 +- 7 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 api/src/main/java/org/motechproject/nms/api/web/RateLimitInterceptor.java diff --git a/api/pom.xml b/api/pom.xml index 635a41200..1980968b2 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -25,6 +25,12 @@ ${motech.version} + + com.github.vladimir-bukhtoyarov + org.motechproject.com.github.vladimir-bukhtoyarov + 4.1.1-${external.dependency.release.tag.new} + + org.motechproject.nms region diff --git a/api/src/main/java/org/motechproject/nms/api/web/RateLimitInterceptor.java b/api/src/main/java/org/motechproject/nms/api/web/RateLimitInterceptor.java new file mode 100644 index 000000000..c686119a2 --- /dev/null +++ b/api/src/main/java/org/motechproject/nms/api/web/RateLimitInterceptor.java @@ -0,0 +1,51 @@ +package org.motechproject.nms.api.web; + +import io.github.bucket4j.*; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.time.Duration; +import java.util.concurrent.TimeUnit; + +public class RateLimitInterceptor implements HandlerInterceptor { + // + private final Bucket bucket; + + public RateLimitInterceptor(int capacity) { + Refill refill = Refill.intervally(capacity, Duration.ofMinutes(1)); + Bandwidth limit = Bandwidth.classic(capacity, refill); + this.bucket = Bucket4j.builder().addLimit(limit).build(); + } + + @Override + public boolean preHandle(HttpServletRequest request, + HttpServletResponse response, Object handler) throws Exception { + System.out.println("Inside pre handle"); + ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(1); + if (probe.isConsumed()) { + response.addHeader("X-Rate-Limit-Remaining", + Long.toString(probe.getRemainingTokens())); + return true; + } +// + response.setStatus(429); // 429 + response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", + Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); + + return false; + } + + @Override + public void postHandle(HttpServletRequest req, HttpServletResponse res, + Object handler, ModelAndView model) throws Exception { + } + + // Called after rendering the view + @Override + public void afterCompletion(HttpServletRequest req, HttpServletResponse res, + Object handler, Exception ex) throws Exception { + } + +} diff --git a/api/src/main/resources/META-INF/motech/applicationContext.xml b/api/src/main/resources/META-INF/motech/applicationContext.xml index 678ced6d7..8b282825a 100644 --- a/api/src/main/resources/META-INF/motech/applicationContext.xml +++ b/api/src/main/resources/META-INF/motech/applicationContext.xml @@ -11,6 +11,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/imi/pom.xml b/imi/pom.xml index a9869b41e..826de2eab 100644 --- a/imi/pom.xml +++ b/imi/pom.xml @@ -27,6 +27,12 @@ ${motech.version} + + com.github.vladimir-bukhtoyarov + org.motechproject.com.github.vladimir-bukhtoyarov + 4.1.1-${external.dependency.release.tag.new} + + @@ -41,11 +47,6 @@ kilkari ${project.version} - - com.github.vladimir-bukhtoyarov - bucket4j-core - 4.1.1 - @@ -60,6 +61,7 @@ 3.1.0 provided + diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java index f98d2f099..798f8044b 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java @@ -1,7 +1,6 @@ package org.motechproject.nms.imi.web; import io.github.bucket4j.*; import org.springframework.web.servlet.HandlerInterceptor; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index 83fcebcc2..f4ed1d422 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -11,8 +11,16 @@ + + + + + + + + diff --git a/pom.xml b/pom.xml index 20e5409fe..d9c81781d 100644 --- a/pom.xml +++ b/pom.xml @@ -663,8 +663,8 @@ com.github.vladimir-bukhtoyarov - bucket4j-core - 4.1.1 + org.motechproject.com.github.vladimir-bukhtoyarov + 4.1.1-${external.dependency.release.tag.new} org.motechproject From 2451b784eb8905a60536d97d3fbb7ac1d149f0ac Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 13 Apr 2020 12:29:11 +0530 Subject: [PATCH 22/28] bucket4j implementation for imi and other modules (in progress) --- .../META-INF/motech/applicationContext.xml | 29 ++++++----- imi/pom.xml | 1 + .../nms/imi/web/RateLimitInterceptor.java | 50 ------------------- .../META-INF/motech/applicationContext.xml | 12 +++-- kilkari/pom.xml | 4 ++ .../service}/RateLimitInterceptor.java | 39 +++++++++++++-- 6 files changed, 64 insertions(+), 71 deletions(-) delete mode 100644 imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java rename {api/src/main/java/org/motechproject/nms/api/web => kilkari/src/main/java/org/motechproject/nms/kilkari/service}/RateLimitInterceptor.java (54%) diff --git a/api/src/main/resources/META-INF/motech/applicationContext.xml b/api/src/main/resources/META-INF/motech/applicationContext.xml index 8b282825a..9c3b00dbe 100644 --- a/api/src/main/resources/META-INF/motech/applicationContext.xml +++ b/api/src/main/resources/META-INF/motech/applicationContext.xml @@ -14,28 +14,31 @@ - - + + + + - - + + + + - - - - - - - + + + + - - + + + + diff --git a/imi/pom.xml b/imi/pom.xml index 826de2eab..709363b94 100644 --- a/imi/pom.xml +++ b/imi/pom.xml @@ -104,6 +104,7 @@ net.sf.cglib.reflect, org.springframework.transaction, org.motechproject.nms.kilkari.repository, + org.motechproject.nms.kilkari.service, org.motechproject.nms.region.service, org.motechproject.nms.region.utils, org.datanucleus.enhancement, diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java b/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java deleted file mode 100644 index 798f8044b..000000000 --- a/imi/src/main/java/org/motechproject/nms/imi/web/RateLimitInterceptor.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.motechproject.nms.imi.web; -import io.github.bucket4j.*; -import org.springframework.web.servlet.HandlerInterceptor; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.springframework.web.servlet.ModelAndView; - -import java.time.Duration; -import java.util.concurrent.TimeUnit; - -public class RateLimitInterceptor implements HandlerInterceptor { -// - private final Bucket bucket; - - public RateLimitInterceptor(int capacity) { - Refill refill = Refill.intervally(capacity, Duration.ofMinutes(1)); - Bandwidth limit = Bandwidth.classic(capacity, refill); - this.bucket = Bucket4j.builder().addLimit(limit).build(); - } - - @Override - public boolean preHandle(HttpServletRequest request, - HttpServletResponse response, Object handler) throws Exception { - System.out.println("Inside pre handle"); - ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(1); - if (probe.isConsumed()) { - response.addHeader("X-Rate-Limit-Remaining", - Long.toString(probe.getRemainingTokens())); - return true; - } -// - response.setStatus(429); // 429 - response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", - Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); - - return false; - } - - @Override - public void postHandle(HttpServletRequest req, HttpServletResponse res, - Object handler, ModelAndView model) throws Exception { - } - - // Called after rendering the view - @Override - public void afterCompletion(HttpServletRequest req, HttpServletResponse res, - Object handler, Exception ex) throws Exception { - } - - } diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index f4ed1d422..09f2aed59 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -13,13 +13,17 @@ - - + + + + - - + + + + diff --git a/kilkari/pom.xml b/kilkari/pom.xml index 6938a454d..a21cbf7bd 100644 --- a/kilkari/pom.xml +++ b/kilkari/pom.xml @@ -60,6 +60,10 @@ rejection-handler ${project.version} + + com.github.vladimir-bukhtoyarov + org.motechproject.com.github.vladimir-bukhtoyarov + diff --git a/api/src/main/java/org/motechproject/nms/api/web/RateLimitInterceptor.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java similarity index 54% rename from api/src/main/java/org/motechproject/nms/api/web/RateLimitInterceptor.java rename to kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java index c686119a2..f50575195 100644 --- a/api/src/main/java/org/motechproject/nms/api/web/RateLimitInterceptor.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java @@ -1,4 +1,4 @@ -package org.motechproject.nms.api.web; +package org.motechproject.nms.kilkari.service; import io.github.bucket4j.*; import org.springframework.web.servlet.HandlerInterceptor; @@ -6,17 +6,26 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.net.HttpURLConnection; +import java.net.URL; import java.time.Duration; import java.util.concurrent.TimeUnit; public class RateLimitInterceptor implements HandlerInterceptor { // private final Bucket bucket; + private final String url = "http://192.168.200.4:8080/NMSReportingSuite/nms/mail/emailAlert"; + private final String api; + private final String USER_AGENT = "Mozilla/5.0"; + private final int capacity; + private final String email = "srivalli@beehyv.com"; - public RateLimitInterceptor(int capacity) { + public RateLimitInterceptor(int capacity, String api) { + this.capacity = capacity; Refill refill = Refill.intervally(capacity, Duration.ofMinutes(1)); Bandwidth limit = Bandwidth.classic(capacity, refill); this.bucket = Bucket4j.builder().addLimit(limit).build(); + this.api = api; } @Override @@ -24,12 +33,18 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Inside pre handle"); ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(1); + if (probe.isConsumed()) { + Long remTokens = probe.getRemainingTokens(); response.addHeader("X-Rate-Limit-Remaining", - Long.toString(probe.getRemainingTokens())); + Long.toString(remTokens)); + if(remTokens<=(0.5*capacity)){ + sendEmailAlert(remTokens); + System.out.println("sendEmailAlert "+api + remTokens); + } return true; } -// + response.setStatus(429); // 429 response.addHeader("X-Rate-Limit-Retry-After-Milliseconds", Long.toString(TimeUnit.NANOSECONDS.toMillis(probe.getNanosToWaitForRefill()))); @@ -48,4 +63,20 @@ public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception ex) throws Exception { } + public void sendEmailAlert(Long remTokens) throws Exception { + String finalUrl = url + "?api=" + api + "&remTokens=" + remTokens + "email=" + email; + URL obj = new URL(finalUrl); + HttpURLConnection con = (HttpURLConnection) obj.openConnection(); + + // optional default is GET + con.setRequestMethod("GET"); + + //add request header + con.setRequestProperty("User-Agent", USER_AGENT); + + int responseCode = con.getResponseCode(); + System.out.println("\nSending 'GET' request to URL : " + finalUrl); + System.out.println("Response Code : " + responseCode); + } + } From 7adaa2447052f796ce3bb00673b31020b604d5da Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 13 Apr 2020 16:57:11 +0530 Subject: [PATCH 23/28] api rate limiting (testing) --- .../main/resources/META-INF/motech/applicationContext.xml | 8 ++++---- .../main/resources/META-INF/motech/applicationContext.xml | 8 ++++---- .../nms/kilkari/service/RateLimitInterceptor.java | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/api/src/main/resources/META-INF/motech/applicationContext.xml b/api/src/main/resources/META-INF/motech/applicationContext.xml index 9c3b00dbe..51550490a 100644 --- a/api/src/main/resources/META-INF/motech/applicationContext.xml +++ b/api/src/main/resources/META-INF/motech/applicationContext.xml @@ -16,28 +16,28 @@ - + - + - + - + diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index 09f2aed59..144bc97b0 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -12,17 +12,17 @@ - + - - + + - + diff --git a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java index f50575195..b0ddd90cf 100644 --- a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java @@ -18,7 +18,7 @@ public class RateLimitInterceptor implements HandlerInterceptor { private final String api; private final String USER_AGENT = "Mozilla/5.0"; private final int capacity; - private final String email = "srivalli@beehyv.com"; + private final String email = "swathi.g@beehyv.com"; public RateLimitInterceptor(int capacity, String api) { this.capacity = capacity; @@ -38,7 +38,7 @@ public boolean preHandle(HttpServletRequest request, Long remTokens = probe.getRemainingTokens(); response.addHeader("X-Rate-Limit-Remaining", Long.toString(remTokens)); - if(remTokens<=(0.5*capacity)){ + if(remTokens==(0.6*capacity)){ sendEmailAlert(remTokens); System.out.println("sendEmailAlert "+api + remTokens); } From 0d0cc15e13730f11600e57b840d77cfa41dde768 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 13 Apr 2020 17:03:56 +0530 Subject: [PATCH 24/28] api rate limiting (testing) --- .../motechproject/nms/kilkari/service/RateLimitInterceptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java index b0ddd90cf..b4c098494 100644 --- a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java @@ -38,7 +38,7 @@ public boolean preHandle(HttpServletRequest request, Long remTokens = probe.getRemainingTokens(); response.addHeader("X-Rate-Limit-Remaining", Long.toString(remTokens)); - if(remTokens==(0.6*capacity)){ + if(remTokens==(0.4*capacity)){ sendEmailAlert(remTokens); System.out.println("sendEmailAlert "+api + remTokens); } From f9edc0a337e4301c56d6a2d13f88a876e7f91a51 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Tue, 14 Apr 2020 02:32:07 +0530 Subject: [PATCH 25/28] rate limiting for all kilkari and MA Apis --- .../META-INF/motech/applicationContext.xml | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/api/src/main/resources/META-INF/motech/applicationContext.xml b/api/src/main/resources/META-INF/motech/applicationContext.xml index 51550490a..64af5948b 100644 --- a/api/src/main/resources/META-INF/motech/applicationContext.xml +++ b/api/src/main/resources/META-INF/motech/applicationContext.xml @@ -12,6 +12,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -33,6 +61,13 @@ + + + + + + + @@ -40,6 +75,20 @@ + + + + + + + + + + + + + + From f1ef33e507ab05d46294b6d58b9a83e910d5e988 Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Wed, 15 Apr 2020 22:51:21 +0530 Subject: [PATCH 26/28] made changes to fix errors in email alert functionality --- .../META-INF/motech/applicationContext.xml | 22 +++++++++---------- .../META-INF/motech/applicationContext.xml | 2 +- .../kilkari/service/RateLimitInterceptor.java | 15 ++++++++----- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/api/src/main/resources/META-INF/motech/applicationContext.xml b/api/src/main/resources/META-INF/motech/applicationContext.xml index 64af5948b..fe0ddbc53 100644 --- a/api/src/main/resources/META-INF/motech/applicationContext.xml +++ b/api/src/main/resources/META-INF/motech/applicationContext.xml @@ -15,77 +15,77 @@ - + - + - + - + - + - + - + - + - + - + - + diff --git a/imi/src/main/resources/META-INF/motech/applicationContext.xml b/imi/src/main/resources/META-INF/motech/applicationContext.xml index 144bc97b0..cf2938cb3 100644 --- a/imi/src/main/resources/META-INF/motech/applicationContext.xml +++ b/imi/src/main/resources/META-INF/motech/applicationContext.xml @@ -12,7 +12,7 @@ - + diff --git a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java index b4c098494..86bc98aae 100644 --- a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java @@ -18,7 +18,7 @@ public class RateLimitInterceptor implements HandlerInterceptor { private final String api; private final String USER_AGENT = "Mozilla/5.0"; private final int capacity; - private final String email = "swathi.g@beehyv.com"; + private final String email = "srivalli@beehyv.com"; public RateLimitInterceptor(int capacity, String api) { this.capacity = capacity; @@ -35,13 +35,17 @@ public boolean preHandle(HttpServletRequest request, ConsumptionProbe probe = this.bucket.tryConsumeAndReturnRemaining(1); if (probe.isConsumed()) { - Long remTokens = probe.getRemainingTokens(); + long remTokens = probe.getRemainingTokens(); response.addHeader("X-Rate-Limit-Remaining", Long.toString(remTokens)); + System.out.println("remaning tokens for this api for this min "+remTokens); if(remTokens==(0.4*capacity)){ - sendEmailAlert(remTokens); + sendEmailAlert(remTokens, "warning", 60); System.out.println("sendEmailAlert "+api + remTokens); } + if(remTokens==(0.2*capacity)){ + sendEmailAlert(remTokens, "critical", 80); + } return true; } @@ -63,8 +67,9 @@ public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception ex) throws Exception { } - public void sendEmailAlert(Long remTokens) throws Exception { - String finalUrl = url + "?api=" + api + "&remTokens=" + remTokens + "email=" + email; + public void sendEmailAlert(long remTokens, String status, long perc) throws Exception { + String finalUrl = url + "?api=" + api + "&remTokens=" + remTokens + "&email=" + email + "&status=" + status + + "&perc=" + perc; URL obj = new URL(finalUrl); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); From 17c6cab255420e6596ea65efff514d4a1a97008a Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 20 Apr 2020 14:37:27 +0530 Subject: [PATCH 27/28] minor changes --- .../nms/kilkari/service/RateLimitInterceptor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java index 86bc98aae..dd1a33355 100644 --- a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/RateLimitInterceptor.java @@ -18,7 +18,7 @@ public class RateLimitInterceptor implements HandlerInterceptor { private final String api; private final String USER_AGENT = "Mozilla/5.0"; private final int capacity; - private final String email = "srivalli@beehyv.com"; + private final String email = "motech-support@beehyv.in"; public RateLimitInterceptor(int capacity, String api) { this.capacity = capacity; @@ -68,7 +68,7 @@ public void afterCompletion(HttpServletRequest req, HttpServletResponse res, } public void sendEmailAlert(long remTokens, String status, long perc) throws Exception { - String finalUrl = url + "?api=" + api + "&remTokens=" + remTokens + "&email=" + email + "&status=" + status + String finalUrl = url + "?api=" + api + "&capacity=" + remTokens + "&email=" + email + "&status=" + status + "&perc=" + perc; URL obj = new URL(finalUrl); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); From efcfbed32eeea98e42d2765258cfc97afe403b0c Mon Sep 17 00:00:00 2001 From: ValliC444 Date: Mon, 20 Apr 2020 14:59:43 +0530 Subject: [PATCH 28/28] Added custom error message for CDR/CSR file copying errors --- .../java/org/motechproject/nms/imi/web/ImiController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/imi/src/main/java/org/motechproject/nms/imi/web/ImiController.java b/imi/src/main/java/org/motechproject/nms/imi/web/ImiController.java index 8c8d1da28..45066154a 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/web/ImiController.java +++ b/imi/src/main/java/org/motechproject/nms/imi/web/ImiController.java @@ -212,7 +212,7 @@ public void notifyNewCdrFile(@RequestBody CdrFileNotificationRequest request) { null )); alertService.create(fileName, "scpCdrFromRemote", error, AlertType.CRITICAL, AlertStatus.NEW, 0, null); - throw new IllegalArgumentException(e.getMessage(), e); + throw new IllegalArgumentException("Error copying CDR file", e); } // Copy the summary file from the IMI share (imi.remote_cdr_dir) into local cdr dir (imi.local_cdr_dir) @@ -231,7 +231,7 @@ public void notifyNewCdrFile(@RequestBody CdrFileNotificationRequest request) { null )); alertService.create(fileName, "scpCdrFromRemote", error, AlertType.CRITICAL, AlertStatus.NEW, 0, null); - throw new IllegalArgumentException(e.getMessage(), e); + throw new IllegalArgumentException("Error copying CSR file", e); } // Checks the CSR/CDR checksum, record count & csv, then sends an event to proceed to phase 2 of the