Author: markt
Date: Mon Aug 22 15:12:18 2016
New Revision: 1757195

URL: http://svn.apache.org/viewvc?rev=1757195&view=rev
Log:
Update the internal fork of Commons FileUpload to afdedc9. This pulls in a fix 
to improve the performance with large multipart boundaries.

Modified:
    tomcat/trunk/MERGE.txt
    
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/MERGE.txt
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/MERGE.txt?rev=1757195&r1=1757194&r2=1757195&view=diff
==============================================================================
--- tomcat/trunk/MERGE.txt (original)
+++ tomcat/trunk/MERGE.txt Mon Aug 22 15:12:18 2016
@@ -56,8 +56,17 @@ Note: Only classes required for Base64 e
 GIT
 ===
 
-Process TBD
+Updates from Git are applied manually via patch files. Patch files are 
generated
+using:
+git diff <last SHA1>:<sub-tree> HEAD:<sub-tree> > temp.patch
+The more recently merged SHA1 for the component below should be updated after
+the patch file has been applied and committed
 
 FileUpload
+Sub-tree:
+src/main/java/org/apache/commons/fileupload
+The SHA1 ID for the most recent commit to be merged to Tomcat is:
+86b11bbc1437a12fa64bc1484c4edc0bdd5a0966
+
 Note: Tomcat's copy of fileupload also includes classes copied manually (rather
       than svn copied) from Commons IO.

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java?rev=1757195&r1=1757194&r2=1757195&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java 
(original)
+++ 
tomcat/trunk/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java 
Mon Aug 22 15:12:18 2016
@@ -226,6 +226,11 @@ public class MultipartStream {
     private final byte[] boundary;
 
     /**
+     * The table for Knuth-Morris-Pratt search algorithm
+     */
+    private int[] boundaryTable;
+
+    /**
      * The length of the buffer used for processing the request.
      */
     private final int bufSize;
@@ -302,12 +307,14 @@ public class MultipartStream {
         this.notifier = pNotifier;
 
         this.boundary = new byte[this.boundaryLength];
+        this.boundaryTable = new int[this.boundaryLength + 1];
         this.keepRegion = this.boundary.length;
 
         System.arraycopy(BOUNDARY_PREFIX, 0, this.boundary, 0,
                 BOUNDARY_PREFIX.length);
         System.arraycopy(boundary, 0, this.boundary, BOUNDARY_PREFIX.length,
                 boundary.length);
+        computeBoundaryTable();
 
         head = 0;
         tail = 0;
@@ -453,6 +460,31 @@ public class MultipartStream {
         }
         System.arraycopy(boundary, 0, this.boundary, BOUNDARY_PREFIX.length,
                 boundary.length);
+        computeBoundaryTable();
+    }
+
+    /**
+     * Compute the table used for Knuth-Morris-Pratt search algorithm.
+     */
+    private void computeBoundaryTable() {
+        int position = 2;
+        int candidate = 0;
+
+        boundaryTable[0] = -1;
+        boundaryTable[1] = 0;
+
+        while (position <= boundaryLength) {
+            if (boundary[position - 1] == boundary[candidate]) {
+                boundaryTable[position] = candidate + 1;
+                candidate++;
+                position++;
+            } else if (candidate > 0) {
+                candidate = boundaryTable[candidate];
+            } else {
+                boundaryTable[position] = 0;
+                position++;
+            }
+        }
     }
 
     /**
@@ -575,6 +607,7 @@ public class MultipartStream {
         // First delimiter may be not preceeded with a CRLF.
         System.arraycopy(boundary, 2, boundary, 0, boundary.length - 2);
         boundaryLength = boundary.length - 2;
+        computeBoundaryTable();
         try {
             // Discard all data up to the delimiter.
             discardBodyData();
@@ -590,6 +623,7 @@ public class MultipartStream {
             boundaryLength = boundary.length;
             boundary[0] = CR;
             boundary[1] = LF;
+            computeBoundaryTable();
         }
     }
 
@@ -645,23 +679,20 @@ public class MultipartStream {
      *         not found.
      */
     protected int findSeparator() {
-        int first;
-        int match = 0;
-        int maxpos = tail - boundaryLength;
-        for (first = head; first <= maxpos && match != boundaryLength; 
first++) {
-            first = findByte(boundary[0], first);
-            if (first == -1 || first > maxpos) {
-                return -1;
-            }
-            for (match = 1; match < boundaryLength; match++) {
-                if (buffer[first + match] != boundary[match]) {
-                    break;
-                }
+
+        int bufferPos = this.head;
+        int tablePos = 0;
+
+        while (bufferPos < this.tail) {
+            while (tablePos >= 0 && buffer[bufferPos] != boundary[tablePos]) {
+                tablePos = boundaryTable[tablePos];
+            }
+            bufferPos++;
+            tablePos++;
+            if (tablePos == boundaryLength) {
+                return bufferPos - boundaryLength;
             }
         }
-        if (match == boundaryLength) {
-            return first - 1;
-        }
         return -1;
     }
 

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1757195&r1=1757194&r2=1757195&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Mon Aug 22 15:12:18 2016
@@ -286,6 +286,11 @@
         Update the internal fork of Commons Codec to r1757174. Code formatting
         changes only. (markt)
       </update>
+      <update>
+        Update the internal fork of Commons FileUpload to afdedc9. This pulls 
in
+        a fix to improve the performance with large multipart boundaries.
+        (markt)
+      </update>
     </changelog>
   </subsection>
 </section>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to