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 <[email protected]>
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 "org.apache.catalina.util.FastRateLimiter".</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 "Too many requests".</p>
</attribute>
- <attribute name="className" required="false">
- <p>The full class name of an implementation of the RateLimiter
interface.
- Default is "org.apache.catalina.util.FastRateLimiter".</p>
- </attribute>
</attributes>
</subsection>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]