This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/10.1.x by this push:
     new 1e6888623b Refactor RateLimitFilter to use FilterBase as the base 
class.
1e6888623b is described below

commit 1e6888623b4764932c761baaebf66f6fab379dd3
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Sun Oct 6 17:07:41 2024 +0100

    Refactor RateLimitFilter to use FilterBase as the base class.
    
    The primary advantage for doing this is less code to process init-param
    values.
---
 .../apache/catalina/filters/RateLimitFilter.java   | 106 ++++++++-------------
 .../catalina/filters/TestRateLimitFilter.java      |   4 +-
 webapps/docs/changelog.xml                         |   5 +
 webapps/docs/config/filter.xml                     |   9 +-
 4 files changed, 53 insertions(+), 71 deletions(-)

diff --git a/java/org/apache/catalina/filters/RateLimitFilter.java 
b/java/org/apache/catalina/filters/RateLimitFilter.java
index a6cccbea30..efcedca0ff 100644
--- a/java/org/apache/catalina/filters/RateLimitFilter.java
+++ b/java/org/apache/catalina/filters/RateLimitFilter.java
@@ -22,7 +22,6 @@ import java.lang.reflect.InvocationTargetException;
 
 import jakarta.servlet.FilterChain;
 import jakarta.servlet.FilterConfig;
-import jakarta.servlet.GenericFilter;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.ServletRequest;
 import jakarta.servlet.ServletResponse;
@@ -72,9 +71,7 @@ import org.apache.tomcat.util.res.StringManager;
  * requests from different IPs in the same bucket and will result in a self 
inflicted DoS attack.
  * </p>
  */
-public class RateLimitFilter extends GenericFilter {
-
-    private static final long serialVersionUID = 1L;
+public class RateLimitFilter extends FilterBase {
 
     /**
      * default duration in seconds
@@ -106,36 +103,6 @@ public class RateLimitFilter extends GenericFilter {
      */
     public static final String RATE_LIMIT_ATTRIBUTE_COUNT = 
"org.apache.catalina.filters.RateLimitFilter.Count";
 
-    /**
-     * init-param to set the bucket duration in seconds
-     */
-    public static final String PARAM_BUCKET_DURATION = "bucketDuration";
-
-    /**
-     * init-param to set the bucket number of requests
-     */
-    public static final String PARAM_BUCKET_REQUESTS = "bucketRequests";
-
-    /**
-     * init-param to set the enforce flag
-     */
-    public static final String PARAM_ENFORCE = "enforce";
-
-    /**
-     * init-param to set a custom status code if requests per duration exceeded
-     */
-    public static final String PARAM_STATUS_CODE = "statusCode";
-
-    /**
-     * init-param to set a class name that implements RateLimiter
-     */
-    public static final String PARAM_CLASS_NAME = "className";
-
-    /**
-     * init-param to set a custom status message if requests per duration 
exceeded
-     */
-    public static final String PARAM_STATUS_MESSAGE = "statusMessage";
-
     transient RateLimiter rateLimiter;
 
     private String rateLimitClassName = 
"org.apache.catalina.util.FastRateLimiter";
@@ -150,45 +117,46 @@ public class RateLimitFilter extends GenericFilter {
 
     private String statusMessage = DEFAULT_STATUS_MESSAGE;
 
+    private String filterName;
+
     private transient Log log = LogFactory.getLog(RateLimitFilter.class);
 
     private static final StringManager sm = 
StringManager.getManager(RateLimitFilter.class);
 
-    @Override
-    public void init() throws ServletException {
 
-        FilterConfig config = getFilterConfig();
+    public void setBucketDuration(int bucketDuration) {
+        this.bucketDuration = bucketDuration;
+    }
 
-        String param;
-        param = config.getInitParameter(PARAM_BUCKET_DURATION);
-        if (param != null) {
-            bucketDuration = Integer.parseInt(param);
-        }
 
-        param = config.getInitParameter(PARAM_BUCKET_REQUESTS);
-        if (param != null) {
-            bucketRequests = Integer.parseInt(param);
-        }
+    public void setBucketRequests(int bucketRequests) {
+        this.bucketRequests = bucketRequests;
+    }
 
-        param = config.getInitParameter(PARAM_ENFORCE);
-        if (param != null) {
-            enforce = Boolean.parseBoolean(param);
-        }
 
-        param = config.getInitParameter(PARAM_STATUS_CODE);
-        if (param != null) {
-            statusCode = Integer.parseInt(param);
-        }
+    public void setEnforce(boolean enforce) {
+        this.enforce = enforce;
+    }
 
-        param = config.getInitParameter(PARAM_STATUS_MESSAGE);
-        if (param != null) {
-            statusMessage = param;
-        }
 
-        param = config.getInitParameter(PARAM_CLASS_NAME);
-        if (param != null) {
-            rateLimitClassName = param;
-        }
+    public void setStatusCode(int statusCode) {
+        this.statusCode = statusCode;
+    }
+
+
+    public void setStatusMessage(String statusMessage) {
+        this.statusMessage = statusMessage;
+    }
+
+
+    public void setRateLimitClassName(String rateLimitClassName) {
+        this.rateLimitClassName = rateLimitClassName;
+    }
+
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+        super.init(filterConfig);
 
         try {
             rateLimiter = 
(RateLimiter)Class.forName(rateLimitClassName).getConstructor().newInstance();
@@ -199,9 +167,11 @@ public class RateLimitFilter extends GenericFilter {
 
         rateLimiter.setDuration(bucketDuration);
         rateLimiter.setRequests(bucketRequests);
-        rateLimiter.setFilterConfig(super.getFilterConfig());
+        rateLimiter.setFilterConfig(filterConfig);
 
-        log.info(sm.getString("rateLimitFilter.initialized", 
super.getFilterName(),
+        filterName = filterConfig.getFilterName();
+
+        log.info(sm.getString("rateLimitFilter.initialized", filterName,
             Integer.valueOf(bucketRequests), Integer.valueOf(bucketDuration),
             Integer.valueOf(rateLimiter.getRequests()), 
Integer.valueOf(rateLimiter.getDuration()),
             (!enforce ? "Not " : "") + "enforcing"));
@@ -218,7 +188,7 @@ public class RateLimitFilter extends GenericFilter {
 
         if (reqCount > rateLimiter.getRequests()) {
 
-            log.warn(sm.getString("rateLimitFilter.maxRequestsExceeded", 
super.getFilterName(),
+            log.warn(sm.getString("rateLimitFilter.maxRequestsExceeded", 
filterName,
                 Integer.valueOf(reqCount), ipAddr, 
Integer.valueOf(rateLimiter.getRequests()),
                 Integer.valueOf(rateLimiter.getDuration())));
 
@@ -236,4 +206,10 @@ public class RateLimitFilter extends GenericFilter {
         rateLimiter.destroy();
         super.destroy();
     }
+
+
+    @Override
+    protected Log getLogger() {
+        return log;
+    }
 }
diff --git a/test/org/apache/catalina/filters/TestRateLimitFilter.java 
b/test/org/apache/catalina/filters/TestRateLimitFilter.java
index ff9bdbf351..57d02307f3 100644
--- a/test/org/apache/catalina/filters/TestRateLimitFilter.java
+++ b/test/org/apache/catalina/filters/TestRateLimitFilter.java
@@ -46,8 +46,8 @@ public class TestRateLimitFilter extends TomcatBaseTest {
         int bucketDuration = 4;
 
         FilterDef filterDef = new FilterDef();
-        filterDef.addInitParameter(RateLimitFilter.PARAM_BUCKET_REQUESTS, 
String.valueOf(bucketRequests));
-        filterDef.addInitParameter(RateLimitFilter.PARAM_BUCKET_DURATION, 
String.valueOf(bucketDuration));
+        filterDef.addInitParameter("bucketRequests", 
String.valueOf(bucketRequests));
+        filterDef.addInitParameter("bucketDuration", 
String.valueOf(bucketDuration));
 
         Tomcat tomcat = getTomcatInstance();
         Context root = tomcat.addContext("", TEMP_DIR);
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index d46dfce754..8e6055031d 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -118,6 +118,11 @@
       <update>
         Improve HTML output of <code>DefaultServlet</code>. (michaelo)
       </update>
+      <scode>
+        Refactor <code>RateLimitFilter</code> to use <code>FilterBase</code> as
+        the base class. The primary advantage for doing this is less code to
+        process <code>init-param</code> values. (markt)
+      </scode>
     </changelog>
   </subsection>
 </section>
diff --git a/webapps/docs/config/filter.xml b/webapps/docs/config/filter.xml
index 577ea5542b..a4fef3d3cf 100644
--- a/webapps/docs/config/filter.xml
+++ b/webapps/docs/config/filter.xml
@@ -1087,6 +1087,11 @@ FINE: Request "/docs/config/manager.html" with response 
status "200"
         Default is <code>true</code>.</p>
       </attribute>
 
+      <attribute name="rateLimitClassName" required="false">
+        <p>The full class name of an implementation of the RateLimiter 
interface.
+        Default is &quot;org.apache.catalina.util.FastRateLimiter&quot;.</p>
+      </attribute>
+
       <attribute name="statusCode" required="false">
         <p>The status code to return when a request is dropped.
         Default is <code>429</code>.</p>
@@ -1097,10 +1102,6 @@ FINE: Request "/docs/config/manager.html" with response 
status "200"
         Default is &quot;Too many requests&quot;.</p>
       </attribute>
 
-      <attribute name="className" required="false">
-        <p>The full class name of an implementation of the RateLimiter 
interface.
-        Default is &quot;org.apache.catalina.util.FastRateLimiter&quot;.</p>
-      </attribute>
     </attributes>
 
   </subsection>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to