You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/06/11 08:29:12 UTC

[incubator-servicecomb-java-chassis] 03/04: [SCB-203] set upload parameters to servlet

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit ba4d889c6b5714ee91a811d115039ffad528cc9d
Author: wujimin <wu...@huawei.com>
AuthorDate: Thu Jun 7 12:53:00 2018 +0800

    [SCB-203] set upload parameters to servlet
---
 .../starter/transport/RestServletInitializer.java  |   5 +-
 .../rest/servlet/CseXmlWebApplicationContext.java  |   3 +-
 .../transport/rest/servlet/ServletUtils.java       |  68 ++++++++++--
 .../transport/rest/servlet/TestServletUtils.java   | 117 +++++++++++++++++++++
 4 files changed, 177 insertions(+), 16 deletions(-)

diff --git a/spring-boot-starter/spring-boot-starter-transport/src/main/java/org/apache/servicecomb/springboot/starter/transport/RestServletInitializer.java b/spring-boot-starter/spring-boot-starter-transport/src/main/java/org/apache/servicecomb/springboot/starter/transport/RestServletInitializer.java
index 0055c5b..175f567 100644
--- a/spring-boot-starter/spring-boot-starter-transport/src/main/java/org/apache/servicecomb/springboot/starter/transport/RestServletInitializer.java
+++ b/spring-boot-starter/spring-boot-starter-transport/src/main/java/org/apache/servicecomb/springboot/starter/transport/RestServletInitializer.java
@@ -24,7 +24,6 @@ import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 
 import org.apache.commons.configuration.Configuration;
-import org.apache.servicecomb.transport.rest.servlet.RestServletInjector;
 import org.apache.servicecomb.transport.rest.servlet.ServletConfig;
 import org.apache.servicecomb.transport.rest.servlet.ServletUtils;
 import org.slf4j.Logger;
@@ -60,8 +59,8 @@ public class RestServletInitializer extends AbstractConfigurableEmbeddedServletC
         Configuration configuration = (Configuration) DynamicPropertyFactory.getBackingConfigurationSource();
         configuration.setProperty(ServletConfig.KEY_SERVLET_URL_PATTERN, ServletConfig.DEFAULT_URL_PATTERN);
       }
-      RestServletInjector.defaultInject(servletContext);
-      ServletUtils.saveUrlPrefix(servletContext);
+
+      ServletUtils.init(servletContext);
     } catch (IOException e) {
       throw new ServletException(e);
     }
diff --git a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/CseXmlWebApplicationContext.java b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/CseXmlWebApplicationContext.java
index ee2fa2c..59918d5 100644
--- a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/CseXmlWebApplicationContext.java
+++ b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/CseXmlWebApplicationContext.java
@@ -53,8 +53,7 @@ public class CseXmlWebApplicationContext extends XmlWebApplicationContext {
     super.invokeBeanFactoryPostProcessors(beanFactory);
 
     // inject servlet after config installed and before transport init
-    RestServletInjector.defaultInject(getServletContext());
-    ServletUtils.saveUrlPrefix(getServletContext());
+    ServletUtils.init(getServletContext());
   }
 
   @Override
diff --git a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java
index a73b149..94c726f 100644
--- a/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java
+++ b/transports/transport-rest/transport-rest-servlet/src/main/java/org/apache/servicecomb/transport/rest/servlet/ServletUtils.java
@@ -17,14 +17,18 @@
 
 package org.apache.servicecomb.transport.rest.servlet;
 
+import java.io.File;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import javax.servlet.MultipartConfigElement;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletRegistration;
+import javax.servlet.ServletRegistration.Dynamic;
 
+import org.apache.servicecomb.common.rest.UploadConfig;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.common.net.IpPort;
 import org.apache.servicecomb.foundation.common.net.NetUtils;
@@ -75,9 +79,7 @@ public class ServletUtils {
 
   static String[] filterUrlPatterns(Collection<String> urlPatterns) {
     return urlPatterns.stream()
-        .filter(pattern -> {
-          return !pattern.trim().isEmpty();
-        })
+        .filter(pattern -> !pattern.trim().isEmpty())
         .filter(pattern -> {
           checkUrlPattern(pattern.trim());
           return true;
@@ -86,13 +88,7 @@ public class ServletUtils {
   }
 
   static String[] collectUrlPatterns(ServletContext servletContext, Class<?> servletCls) {
-    List<ServletRegistration> servlets = servletContext.getServletRegistrations()
-        .values()
-        .stream()
-        .filter(predicate -> {
-          return predicate.getClassName().equals(servletCls.getName());
-        })
-        .collect(Collectors.toList());
+    List<ServletRegistration> servlets = findServletRegistrations(servletContext, servletCls);
     if (servlets.isEmpty()) {
       return new String[] {};
     }
@@ -108,13 +104,22 @@ public class ServletUtils {
     return filterUrlPatterns(mappings);
   }
 
+  static List<ServletRegistration> findServletRegistrations(ServletContext servletContext,
+      Class<?> servletCls) {
+    return servletContext.getServletRegistrations()
+        .values()
+        .stream()
+        .filter(predicate -> predicate.getClassName().equals(servletCls.getName()))
+        .collect(Collectors.toList());
+  }
+
   static String collectUrlPrefix(ServletContext servletContext, Class<?> servletCls) {
     String[] urlPatterns = collectUrlPatterns(servletContext, servletCls);
     if (urlPatterns.length == 0) {
       return null;
     }
 
-    // even have multiple urlPattern, we only choose a to set as urlPrefix
+    // even have multiple urlPattern, we only choose one to set as urlPrefix
     // only make sure sdk can invoke
     String urlPattern = urlPatterns[0];
     return servletContext.getContextPath() + urlPattern.substring(0, urlPattern.length() - 2);
@@ -130,4 +135,45 @@ public class ServletUtils {
     System.setProperty(Const.URL_PREFIX, urlPrefix);
     LOGGER.info("UrlPrefix of this instance is \"{}\".", urlPrefix);
   }
+
+  static File createUploadDir(ServletContext servletContext, String location) {
+    // If relative, it is relative to TEMPDIR
+    File dir = new File(location);
+    if (!dir.isAbsolute()) {
+      dir = new File((File) servletContext.getAttribute(ServletContext.TEMPDIR), location).getAbsoluteFile();
+    }
+
+    if (!dir.exists()) {
+      dir.mkdirs();
+    }
+
+    return dir;
+  }
+
+  static void setServletParameters(ServletContext servletContext) {
+    UploadConfig uploadConfig = new UploadConfig();
+    MultipartConfigElement multipartConfig = uploadConfig.toMultipartConfigElement();
+    if (multipartConfig == null) {
+      return;
+    }
+
+    File dir = createUploadDir(servletContext, multipartConfig.getLocation());
+    LOGGER.info("set uploads directory to {}.", dir.getAbsolutePath());
+
+    List<ServletRegistration> servlets = findServletRegistrations(servletContext, RestServlet.class);
+    for (ServletRegistration servletRegistration : servlets) {
+      if (!Dynamic.class.isInstance(servletRegistration)) {
+        continue;
+      }
+
+      Dynamic dynamic = (Dynamic) servletRegistration;
+      dynamic.setMultipartConfig(multipartConfig);
+    }
+  }
+
+  public static void init(ServletContext servletContext) {
+    RestServletInjector.defaultInject(servletContext);
+    ServletUtils.saveUrlPrefix(servletContext);
+    setServletParameters(servletContext);
+  }
 }
diff --git a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java
index bf17198..2850694 100644
--- a/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java
+++ b/transports/transport-rest/transport-rest-servlet/src/test/java/org/apache/servicecomb/transport/rest/servlet/TestServletUtils.java
@@ -17,25 +17,50 @@
 
 package org.apache.servicecomb.transport.rest.servlet;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
+import javax.servlet.MultipartConfigElement;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletRegistration;
+import javax.servlet.ServletRegistration.Dynamic;
+import javax.servlet.http.HttpServlet;
 
+import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
+import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
 import org.apache.servicecomb.serviceregistry.api.Const;
 import org.hamcrest.Matchers;
+import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
 import mockit.Expectations;
+import mockit.Mock;
+import mockit.MockUp;
 import mockit.Mocked;
 
 public class TestServletUtils {
+  @Before
+  public void setUp() {
+    ArchaiusUtils.resetConfig();
+  }
+
+  @After
+  public void tearDown() {
+    ArchaiusUtils.resetConfig();
+  }
+
   @Test
   public void testCheckUrlPatternNormal() {
     ServletUtils.checkUrlPattern("/*");
@@ -179,4 +204,96 @@ public class TestServletUtils {
     Assert.assertThat(System.getProperty(Const.URL_PREFIX), Matchers.is("/root/rest"));
     System.clearProperty(Const.URL_PREFIX);
   }
+
+  @Test
+  public void createUploadDir_relative(@Mocked ServletContext servletContext) throws IOException {
+    File tempDir = Files.createTempDirectory("temp").toFile();
+    new Expectations() {
+      {
+        servletContext.getAttribute(ServletContext.TEMPDIR);
+        result = tempDir;
+      }
+    };
+
+    File expectDir = new File(tempDir, "upload");
+    Assert.assertFalse(expectDir.exists());
+
+    File dir = ServletUtils.createUploadDir(servletContext, "upload");
+    Assert.assertTrue(expectDir.exists());
+    Assert.assertEquals(expectDir.getAbsolutePath(), dir.getAbsolutePath());
+
+    dir.delete();
+    Assert.assertFalse(expectDir.exists());
+
+    tempDir.delete();
+    Assert.assertFalse(tempDir.exists());
+  }
+
+  @Test
+  public void createUploadDir_absolute(@Mocked ServletContext servletContext) throws IOException {
+    File tempDir = Files.createTempDirectory("temp").toFile();
+
+    File expectDir = new File(tempDir, "upload");
+    Assert.assertFalse(expectDir.exists());
+
+    File dir = ServletUtils.createUploadDir(servletContext, expectDir.getAbsolutePath());
+    Assert.assertTrue(expectDir.exists());
+    Assert.assertEquals(expectDir.getAbsolutePath(), dir.getAbsolutePath());
+
+    dir.delete();
+    Assert.assertFalse(expectDir.exists());
+
+    tempDir.delete();
+    Assert.assertFalse(tempDir.exists());
+  }
+
+  @Test
+  public void setServletParameters_notSupportUpload() {
+    // not support upload will not set parameters to servlet, so servletContext is null will not throw exception
+    ServletUtils.setServletParameters(null);
+  }
+
+  @Test
+  public void setServletParameters_supportUpload(@Mocked ServletContext servletContext, @Mocked Dynamic d1,
+      @Mocked ServletRegistration d2) throws IOException {
+    Map<String, ServletRegistration> servletRegistrations = new HashMap<>();
+    servletRegistrations.put("d1", d1);
+    servletRegistrations.put("d2", d2);
+    new Expectations() {
+      {
+        servletContext.getServletRegistrations();
+        result = servletRegistrations;
+        d1.getClassName();
+        result = RestServlet.class.getName();
+        d2.getClassName();
+        result = HttpServlet.class.getName();
+      }
+    };
+
+    List<MultipartConfigElement> multipartConfigs = new ArrayList<>();
+    new MockUp<Dynamic>(d1) {
+      @Mock
+      void setMultipartConfig(MultipartConfigElement multipartConfig) {
+        multipartConfigs.add(multipartConfig);
+      }
+    };
+
+    File tempDir = Files.createTempDirectory("temp").toFile();
+    File uploadDir = new File(tempDir, "upload");
+    ArchaiusUtils.setProperty(RestConst.UPLOAD_DIR, uploadDir.getAbsolutePath());
+
+    ServletUtils.setServletParameters(servletContext);
+
+    Assert.assertEquals(1, multipartConfigs.size());
+
+    MultipartConfigElement multipartConfigElement = multipartConfigs.get(0);
+    Assert.assertEquals(uploadDir.getAbsolutePath(), multipartConfigElement.getLocation());
+    Assert.assertEquals(-1, multipartConfigElement.getMaxFileSize());
+    Assert.assertEquals(-1, multipartConfigElement.getMaxRequestSize());
+    Assert.assertEquals(0, multipartConfigElement.getFileSizeThreshold());
+
+    uploadDir.delete();
+    tempDir.delete();
+    Assert.assertFalse(tempDir.exists());
+  }
 }

-- 
To stop receiving notification emails like this one, please contact
liubao@apache.org.