Repository: struts
Updated Branches:
  refs/heads/master 41c633581 -> ff6148795


WW-4839 JakartaStreamMultiPartRequest Should Honor "struts.multipart.maxSize"


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/eb013716
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/eb013716
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/eb013716

Branch: refs/heads/master
Commit: eb0137168f0c0e09a1ef6532965ffc1634a36291
Parents: c9d20b5
Author: Aaron Johnson <johnson.aar...@gmail.com>
Authored: Fri Aug 4 15:58:23 2017 -0500
Committer: Aaron Johnson <johnson.aar...@gmail.com>
Committed: Fri Aug 4 15:58:23 2017 -0500

----------------------------------------------------------------------
 .../JakartaStreamMultiPartRequest.java          |  3 +
 .../JakartaStreamMultiPartRequestTest.java      | 58 ++++++++++++++++++++
 2 files changed, 61 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/eb013716/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
 
b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
index 4703338..b8c1a33 100644
--- 
a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
+++ 
b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
@@ -191,6 +191,9 @@ public class JakartaStreamMultiPartRequest extends 
AbstractMultiPartRequest {
             // Interface with Commons FileUpload API
             // Using the Streaming API
             ServletFileUpload servletFileUpload = new ServletFileUpload();
+            if (maxSizeProvided) {
+                servletFileUpload.setSizeMax(maxSize);
+            }
             FileItemIterator i = servletFileUpload.getItemIterator(request);
 
             // Iterate the file items

http://git-wip-us.apache.org/repos/asf/struts/blob/eb013716/core/src/test/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequestTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequestTest.java
 
b/core/src/test/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequestTest.java
new file mode 100644
index 0000000..04195cb
--- /dev/null
+++ 
b/core/src/test/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequestTest.java
@@ -0,0 +1,58 @@
+package org.apache.struts2.dispatcher.multipart;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.struts2.dispatcher.LocalizedMessage;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.springframework.mock.web.DelegatingServletInputStream;
+import org.testng.Assert;
+
+public class JakartaStreamMultiPartRequestTest {
+
+    private JakartaStreamMultiPartRequest multiPart;
+    private Path tempDir;
+    
+    @Before
+    public void initialize() {
+        multiPart = new JakartaStreamMultiPartRequest();
+        tempDir = Paths.get("target", "multi-part-test");
+    }
+    
+    /**
+     * Number of bytes in files greater than 2GB overflow the {@code int} 
primative.
+     * The {@link HttpServletRequest#getContentLength()} returns {@literal -1} 
+     * when the header is not present or the size is greater than {@link 
Integer#MAX_VALUE}.
+     * @throws IOException 
+     */
+    @Test
+    public void unknownContentLength() throws IOException {
+        HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+        
Mockito.when(request.getContentType()).thenReturn("multipart/form-data; 
charset=utf-8; boundary=__X_BOUNDARY__");
+        Mockito.when(request.getMethod()).thenReturn("POST");
+        
Mockito.when(request.getContentLength()).thenReturn(Integer.valueOf(-1));
+        StringBuilder entity = new StringBuilder();
+        entity.append("\r\n--__X_BOUNDARY__\r\n");
+        entity.append("Content-Disposition: form-data; name=\"upload\"; 
filename=\"test.csv\"\r\n");
+        entity.append("Content-Type: text/csv\r\n\r\n1,2\r\n\r\n");
+        entity.append("--__X_BOUNDARY__\r\n");
+        entity.append("Content-Disposition: form-data; name=\"upload2\"; 
filename=\"test2.csv\"\r\n");
+        entity.append("Content-Type: text/csv\r\n\r\n3,4\r\n\r\n");
+        entity.append("--__X_BOUNDARY__--\r\n");
+        Mockito.when(request.getInputStream()).thenReturn(new 
DelegatingServletInputStream(new 
ByteArrayInputStream(entity.toString().getBytes(StandardCharsets.UTF_8))));
+        multiPart.setMaxSize("4");
+        multiPart.parse(request, tempDir.toString());
+        LocalizedMessage next = multiPart.getErrors().iterator().next();
+        Assert.assertEquals(next.getTextKey(), 
"struts.messages.upload.error.SizeLimitExceededException");
+    }
+}

Reply via email to