You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2020/04/27 22:40:09 UTC
[tomcat] 01/04: Fix
https://bz.apache.org/bugzilla/show_bug.cgi?id=64384
This is an automated email from the ASF dual-hosted git repository.
remm pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 56f21b8654260291d1e088016ab1145779c3329c
Author: Christopher Schultz <ch...@christopherschultz.net>
AuthorDate: Mon Apr 27 18:01:00 2020 -0400
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=64384
Respect partial multipart-config elements.
---
.../org/apache/catalina/startup/ContextConfig.java | 30 ++--
.../catalina/startup/TestMultipartConfig.java | 171 +++++++++++++++++++++
2 files changed, 189 insertions(+), 12 deletions(-)
diff --git a/java/org/apache/catalina/startup/ContextConfig.java b/java/org/apache/catalina/startup/ContextConfig.java
index 82db594..252912b 100644
--- a/java/org/apache/catalina/startup/ContextConfig.java
+++ b/java/org/apache/catalina/startup/ContextConfig.java
@@ -1362,19 +1362,25 @@ public class ContextConfig implements LifecycleListener {
wrapper.setServletClass(servlet.getServletClass());
MultipartDef multipartdef = servlet.getMultipartDef();
if (multipartdef != null) {
- if (multipartdef.getMaxFileSize() != null &&
- multipartdef.getMaxRequestSize()!= null &&
- multipartdef.getFileSizeThreshold() != null) {
- wrapper.setMultipartConfigElement(new MultipartConfigElement(
- multipartdef.getLocation(),
- Long.parseLong(multipartdef.getMaxFileSize()),
- Long.parseLong(multipartdef.getMaxRequestSize()),
- Integer.parseInt(
- multipartdef.getFileSizeThreshold())));
- } else {
- wrapper.setMultipartConfigElement(new MultipartConfigElement(
- multipartdef.getLocation()));
+ long maxFileSize = -1;
+ long maxRequestSize = -1;
+ int fileSizeThreshold = 0;
+
+ if(null != multipartdef.getMaxFileSize()) {
+ maxFileSize = Long.parseLong(multipartdef.getMaxFileSize());
+ }
+ if(null != multipartdef.getMaxRequestSize()) {
+ maxRequestSize = Long.parseLong(multipartdef.getMaxRequestSize());
}
+ if(null != multipartdef.getFileSizeThreshold()) {
+ fileSizeThreshold = Integer.parseInt(multipartdef.getFileSizeThreshold());
+ }
+
+ wrapper.setMultipartConfigElement(new MultipartConfigElement(
+ multipartdef.getLocation(),
+ maxFileSize,
+ maxRequestSize,
+ fileSizeThreshold));
}
if (servlet.getAsyncSupported() != null) {
wrapper.setAsyncSupported(
diff --git a/test/org/apache/catalina/startup/TestMultipartConfig.java b/test/org/apache/catalina/startup/TestMultipartConfig.java
new file mode 100644
index 0000000..d0ca905
--- /dev/null
+++ b/test/org/apache/catalina/startup/TestMultipartConfig.java
@@ -0,0 +1,171 @@
+package org.apache.catalina.startup;
+
+import java.lang.reflect.Method;
+
+import jakarta.servlet.MultipartConfigElement;
+
+import org.apache.catalina.Container;
+import org.apache.catalina.Context;
+import org.apache.catalina.LifecycleState;
+import org.apache.catalina.connector.Connector;
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.core.StandardEngine;
+import org.apache.catalina.core.StandardHost;
+import org.apache.catalina.core.StandardService;
+import org.apache.catalina.core.StandardWrapper;
+import org.apache.tomcat.util.descriptor.web.MultipartDef;
+import org.apache.tomcat.util.descriptor.web.ServletDef;
+import org.apache.tomcat.util.descriptor.web.WebXml;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestMultipartConfig {
+ @Test
+ public void testNoMultipartConfig() throws Exception {
+ StandardWrapper servlet = config(null);
+
+ MultipartConfigElement mce = servlet.getMultipartConfigElement();
+
+ Assert.assertNull(mce);
+ }
+
+ @Test
+ public void testDefaultMultipartConfig() throws Exception {
+ MultipartDef multipartDef = new MultipartDef();
+ // Do not set any attributes on multipartDef: expect defaults
+
+ StandardWrapper servlet = config(multipartDef);
+ MultipartConfigElement mce = servlet.getMultipartConfigElement();
+
+ Assert.assertNotNull(mce);
+ Assert.assertEquals("", mce.getLocation());
+ Assert.assertEquals(-1, mce.getMaxFileSize());
+ Assert.assertEquals(-1, mce.getMaxRequestSize());
+ Assert.assertEquals(0, mce.getFileSizeThreshold());
+ }
+
+ @Test
+ public void testPartialMultipartConfigMaxFileSize() throws Exception {
+ MultipartDef multipartDef = new MultipartDef();
+ multipartDef.setMaxFileSize("1024");
+
+ StandardWrapper servlet = config(multipartDef);
+ MultipartConfigElement mce = servlet.getMultipartConfigElement();
+
+ Assert.assertNotNull(mce);
+ Assert.assertEquals("", mce.getLocation());
+ Assert.assertEquals(1024, mce.getMaxFileSize());
+ Assert.assertEquals(-1, mce.getMaxRequestSize());
+ Assert.assertEquals(0, mce.getFileSizeThreshold());
+ }
+
+ @Test
+ public void testPartialMultipartConfigMaxReqeustSize() throws Exception {
+ MultipartDef multipartDef = new MultipartDef();
+ multipartDef.setMaxRequestSize("10240");
+
+ StandardWrapper servlet = config(multipartDef);
+ MultipartConfigElement mce = servlet.getMultipartConfigElement();
+
+ Assert.assertNotNull(mce);
+ Assert.assertEquals("", mce.getLocation());
+ Assert.assertEquals(-1, mce.getMaxFileSize());
+ Assert.assertEquals(10240, mce.getMaxRequestSize());
+ Assert.assertEquals(0, mce.getFileSizeThreshold());
+ }
+
+ @Test
+ public void testPartialMultipartConfigFileSizeThreshold() throws Exception {
+ MultipartDef multipartDef = new MultipartDef();
+ multipartDef.setFileSizeThreshold("24");
+
+ StandardWrapper servlet = config(multipartDef);
+ MultipartConfigElement mce = servlet.getMultipartConfigElement();
+
+ Assert.assertNotNull(mce);
+ Assert.assertEquals("", mce.getLocation());
+ Assert.assertEquals(-1, mce.getMaxFileSize());
+ Assert.assertEquals(-1, mce.getMaxRequestSize());
+ Assert.assertEquals(24, mce.getFileSizeThreshold());
+ }
+
+ @Test
+ public void testCompleteMultipartConfig() throws Exception {
+ MultipartDef multipartDef = new MultipartDef();
+ multipartDef.setMaxFileSize("1024");
+ multipartDef.setMaxRequestSize("10240");
+ multipartDef.setFileSizeThreshold("24");
+ multipartDef.setLocation("/tmp/foo");
+
+ StandardWrapper servlet = config(multipartDef);
+
+ MultipartConfigElement mce = servlet.getMultipartConfigElement();
+
+ Assert.assertNotNull(mce);
+ Assert.assertEquals("/tmp/foo", mce.getLocation());
+ Assert.assertEquals(1024, mce.getMaxFileSize());
+ Assert.assertEquals(10240, mce.getMaxRequestSize());
+ Assert.assertEquals(24, mce.getFileSizeThreshold());
+ }
+
+ private StandardWrapper config(MultipartDef multipartDef) throws Exception {
+ MyContextConfig config = new MyContextConfig();
+
+ WebXml webxml = new WebXml();
+
+ ServletDef servletDef = new ServletDef();
+ servletDef.setServletName("test");
+ servletDef.setServletClass("org.apache.catalina.startup.ParamServlet");
+ servletDef.setMultipartDef(multipartDef);
+ webxml.addServlet(servletDef);
+
+ Method m = ContextConfig.class.getDeclaredMethod("configureContext", WebXml.class);
+
+ // Force our way in
+ m.setAccessible(true);
+
+ m.invoke(config, webxml);
+
+ StandardWrapper servlet = (StandardWrapper)config.getContext().findChild("test");
+
+ return servlet;
+ }
+
+ private static class MyContextConfig extends ContextConfig {
+ public MyContextConfig() {
+ CustomContext context = new CustomContext();
+ super.context = context;
+ context.setConfigured(false);
+ context.setState(LifecycleState.STARTING_PREP);
+ context.setName("test");
+
+ Connector connector = new Connector();
+ StandardService service = new StandardService();
+ service.addConnector(connector);
+ StandardEngine engine = new StandardEngine();
+ engine.setService(service);
+ Container parent = new StandardHost();
+ parent.setParent(engine);
+ super.context.setParent(parent);
+ context.getState().equals(LifecycleState.STARTING_PREP);
+ }
+ public Context getContext() {
+ return super.context;
+ }
+ }
+
+ private static class CustomContext extends StandardContext {
+ private volatile LifecycleState state;
+
+ @Override
+ public LifecycleState getState() {
+ return state;
+ }
+
+ @Override
+ public synchronized void setState(LifecycleState state) {
+ this.state = state;
+ }
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org