I'll see about getting this committed for our next release, Jason. Thanks for the patch..

On 08/23/2011 09:42 AM, Jason Lee wrote:
I have been trying to get tr:inputFile to work, but I keep getting EOFExceptions. I traced it down to MultipartFormHandler._skipBoundary(). The first issue is the EOFException, as noted in the comment, is a horribly misleading exception. :) The reason the exception was thrown, though, seems to be a problem with the boundary handling.

In _parseBoundary(), contentType might be passed something like "multipart/form-data; boundary=---------------------------135858097916243791492128236579;charset=UTF-8". However, when _skipBoundary() is called, _readLine() returns "-----------------------------135858097916243791492128236579". Note that the first string has ";charset=UTF-8" at the end, while the second does not. It seems that ExternalContext.getContentType() appends that for reason (I'm posting from a Facelets page with the encoding set to UTF-8 ("<?xml version='1.0' encoding='UTF-8' ?>"), so that might be the case.

At any rate, I made the following changes that seems to allow the uploads to work as expected (as well as throwing what seems to me be a more reasonable Exception, though it could use i18n help).

Is there a chance we could get this change reviewed and committed? Or perhaps a better explanation of/fix for what we're seeing?

Thanks! :)

Index: trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java
===================================================================
--- trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java (revision 1160712) +++ trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java (working copy)
@@ -225,7 +225,7 @@
     if (!line.startsWith(_boundary))
     {
       // A better exception would be nice.
-      throw new EOFException();
+ throw new IllegalStateException("Boundary information not found. Unable to process upload.");
     }
   }

@@ -388,9 +388,14 @@
     {
       return null;
     }
+ String boundary = contentType.substring(boundaryStart + _BOUNDARY_PARAMETER.length());
+    final int semicolonIndex = boundary.indexOf(";");
+    if (semicolonIndex > -1) {
+        boundary = boundary.substring(0, semicolonIndex);
+    }

     // Boundary always starts with "--"
- return "--" + contentType.substring(boundaryStart + _BOUNDARY_PARAMETER.length());
+    return "--" + boundary;
   }

   //Reads the ContentType string out of a line of the incoming request



Reply via email to