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