diff --git a/java/org/apache/catalina/startup/ContextRuleSet.java b/java/org/apache/catalina/startup/ContextRuleSet.java index 4aa081e08308..5864a104c258 100644 --- a/java/org/apache/catalina/startup/ContextRuleSet.java +++ b/java/org/apache/catalina/startup/ContextRuleSet.java @@ -212,6 +212,9 @@ public void addRuleInstances(Digester digester) { null, // MUST be specified in the element "className"); digester.addSetProperties(prefix + "Context/Valve"); + digester.addCallMethod(prefix + "Context/Valve/init-param", "addInitParam", 2); + digester.addCallParam(prefix + "Context/Valve/init-param/param-name", 0); + digester.addCallParam(prefix + "Context/Valve/init-param/param-value", 1); digester.addSetNext(prefix + "Context/Valve", "addValve", "org.apache.catalina.Valve"); diff --git a/java/org/apache/catalina/startup/EngineRuleSet.java b/java/org/apache/catalina/startup/EngineRuleSet.java index f98e285a866c..153d3648543c 100644 --- a/java/org/apache/catalina/startup/EngineRuleSet.java +++ b/java/org/apache/catalina/startup/EngineRuleSet.java @@ -111,6 +111,9 @@ public void addRuleInstances(Digester digester) { null, // MUST be specified in the element "className"); digester.addSetProperties(prefix + "Engine/Valve"); + digester.addCallMethod(prefix + "Engine/Valve/init-param", "addInitParam", 2); + digester.addCallParam(prefix + "Engine/Valve/init-param/param-name", 0); + digester.addCallParam(prefix + "Engine/Valve/init-param/param-value", 1); digester.addSetNext(prefix + "Engine/Valve", "addValve", "org.apache.catalina.Valve"); diff --git a/java/org/apache/catalina/startup/HostRuleSet.java b/java/org/apache/catalina/startup/HostRuleSet.java index 3114cc1f9ad1..135ceb06c4c5 100644 --- a/java/org/apache/catalina/startup/HostRuleSet.java +++ b/java/org/apache/catalina/startup/HostRuleSet.java @@ -115,6 +115,9 @@ public void addRuleInstances(Digester digester) { null, // MUST be specified in the element "className"); digester.addSetProperties(prefix + "Host/Valve"); + digester.addCallMethod(prefix + "Host/Valve/init-param", "addInitParam", 2); + digester.addCallParam(prefix + "Host/Valve/init-param/param-name", 0); + digester.addCallParam(prefix + "Host/Valve/init-param/param-value", 1); digester.addSetNext(prefix + "Host/Valve", "addValve", "org.apache.catalina.Valve"); diff --git a/java/org/apache/catalina/valves/FilterValve.java b/java/org/apache/catalina/valves/FilterValve.java new file mode 100644 index 000000000000..44192671c998 --- /dev/null +++ b/java/org/apache/catalina/valves/FilterValve.java @@ -0,0 +1,262 @@ +package org.apache.catalina.valves; + +import java.io.IOException; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.concurrent.ScheduledExecutorService; + +import org.apache.catalina.Container; +import org.apache.catalina.Context; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.connector.Request; +import org.apache.catalina.connector.Response; +import org.apache.tomcat.util.threads.ScheduledThreadPoolExecutor; + +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; + +/** + *
A Valve to wrap a Filter, allowing a user to run Servlet Filters as a + * part of the Valve chain.
+ * + *There are some caveats you must be aware of when using this Valve + * to wrap a Filter:
+ * + *null
.<Context>
, but will return a ServletContext
+ * which is nearly useless for any Valve/Filter specified on
+ * an <Engine>
or >Host<
.null
+ */
+ @Override
+ public String getFilterName() {
+ return null;
+ }
+
+ /**
+ * Gets the ServletContext.
+ *
+ * Note that this will be of limited use if the Valve/Filter is not
+ * attached to a <Context>
.
+ */
+ @Override
+ public ServletContext getServletContext() {
+ if(null == application) {
+ throw new IllegalStateException("Filter " + filter + " has called getServletContext from FilterValve, but this FilterValve is not ");
+ } else {
+ return application;
+ }
+ }
+
+ /**
+ * Gets the initialization parameter with the specified name.
+ *
+ * @param name The name of the initialization parameter.
+ *
+ * @return The value for the initialization parameter, or
+ * null
if there is no value for the
+ * specified initialization parameter name.
+ */
+ @Override
+ public String getInitParameter(String name) {
+ if(null == filterInitParams) {
+ return null;
+ } else {
+ return filterInitParams.get(name);
+ }
+ }
+
+ /**
+ * Gets an enumeration of the names of all initialization parameters.
+ *
+ * @return An enumeration of the names of all initialization parameters.
+ */
+ @Override
+ public Enumeration