This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push: new 25d80e93a5 Refactor RateLimitFilter to use FilterBase as the base class. 25d80e93a5 is described below commit 25d80e93a5fc0ef076d0239c8a844c8a24f22c8f 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/config/filter.xml | 9 +- 3 files changed, 48 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/config/filter.xml b/webapps/docs/config/filter.xml index 3d236a77bf..c0f5fe6103 100644 --- a/webapps/docs/config/filter.xml +++ b/webapps/docs/config/filter.xml @@ -1033,6 +1033,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> @@ -1043,10 +1048,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: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org