[ 
https://issues.apache.org/jira/browse/FILEUPLOAD-136?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12513129
 ] 

Keith Kowalczykowski commented on FILEUPLOAD-136:
-------------------------------------------------

>is there any indication that this is a fileupload bug? its possible that its 
>Jetty's fault... especially with the last few lines in that stack trace being 
>in Jetty code. 

Maurice,

I'm not sure who's fault it is. When I originally posted this issue,  I took a 
look at the file upload code and it is quite complex, so I couldn't really 
figure out what was going on. They perform a lot of hard for-loops that are 
supposed to break out if some condition occurs, but obviously it is not 
occurring in this case. Therefore, I'm not sure whether the file upload code is 
incorrect, and they were just lucky that it worked correctly under (presumably) 
tomcat. Or if it truly is a bug in Jetty.  I was hoping that someone here could 
confirm that it is a Jetty bug before passing it on to them, as I have no way 
to describe the problem to the jetty guys, or proof that it is even their 
problem.

> FileUpload race condition with used with Jetty 6
> ------------------------------------------------
>
>                 Key: FILEUPLOAD-136
>                 URL: https://issues.apache.org/jira/browse/FILEUPLOAD-136
>             Project: Commons FileUpload
>          Issue Type: Bug
>    Affects Versions: 1.2
>         Environment: Running on Windows XP SP2 with Jetty 6 embedded and 
> Firefox 2.0.0.4
>            Reporter: Keith Kowalczykowski
>            Priority: Critical
>         Attachments: FileUploadTest.zip
>
>
> When running commons file upload with Jetty 6, ServletFileUpload.parseRequest 
> spins and never returns when the user clicks the "stop" button in their 
> browser while an upload is in progress.
> Reproduction Steps:
>  * Create a simple servlet / html form which accepts a file upload using 
> commons file upload (or use the example code below).
>  * Upload a sufficiently large file that you have time to click the stop 
> button before the upload completes.
>  * Observe that the thread is now stuck within file upload.
> Other Information:
> Using jstack, I was able to get the following trace of where it is blocking. 
> It looks like it is on a read() call that file upload is making.
>     at org/mortbay/jetty/HttpParser$Input.blockForContent(HttpParser.java:922)
>     at org/mortbay/jetty/HttpParser$Input.read(HttpParser.java:897)
>     at 
> org/apache/commons/fileupload/MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:959)
>     at 
> org/apache/commons/fileupload/MultipartStream$ItemInputStream.close(MultipartStream.java:910)
>     at org/apache/commons/fileupload/util/Streams.copy(Streams.java:119)
>     at org/apache/commons/fileupload/util/Streams.copy(Streams.java:64)
>     at 
> org/apache/commons/fileupload/FileUploadBase.parseRequest(FileUploadBase.java:354)
>     at 
> org/apache/commons/fileupload/servlet/ServletFileUpload.parseRequest(ServletFileUpload.java:126)
>     at test/Main$1.handle(Main.java:43)
>     at 
> org/mortbay/jetty/handler/HandlerWrapper.handle(HandlerWrapper.java:139)
>     at org/mortbay/jetty/Server.handle(Server.java:285)
>     at org/mortbay/jetty/HttpConnection.handleRequest(HttpConnection.java:502)
>     at 
> org/mortbay/jetty/HttpConnection$RequestHandler.content(HttpConnection.java:835)
>     at org/mortbay/jetty/HttpParser.parseNext(HttpParser.java:641)
>     at org/mortbay/jetty/HttpParser.parseAvailable(HttpParser.java:208)
>     at org/mortbay/jetty/HttpConnection.handle(HttpConnection.java:378)
>     at 
> org/mortbay/jetty/bio/SocketConnector$Connection.run(SocketConnector.java:226)
>     at 
> org/mortbay/thread/BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
>     at jrockit/vm/RNI.c2java(IIII)V(Native Method)
>     -- end of trac
> Originally I thought this was an issue with our code, however, I have since 
> isolated it to a simple test case. Bellow is a class file called Main which 
> when run will instantiate an instance of Jetty on port 8080 and an HTML 
> document that will post a file upload to the servlet. When the stop button is 
> pressed, you will see that the line "Starting processing" is printed, but 
> neither the "Exception occured in processing" or "Processing completed" are 
> printed. I have a full eclipse project (jars and all) on my machine that I 
> was planning on uploading with this ticket, however, I don't see a way to 
> attach a file. Therefore, I have copied and pasted the two files bellow. Let 
> me know if you want the full project.
> === Main.java ===
> /**
>  * 
>  */
> package test;
> import java.io.IOException;
> import java.util.List;
> import javax.servlet.ServletException;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
> import org.apache.commons.fileupload.FileItem;
> import org.apache.commons.fileupload.disk.DiskFileItemFactory;
> import org.apache.commons.fileupload.servlet.ServletFileUpload;
> import org.mortbay.jetty.Handler;
> import org.mortbay.jetty.Server;
> import org.mortbay.jetty.handler.AbstractHandler;
> /**
>  * @author Keith Kowalczykowski
>  * 
>  */
> public class Main {
>       public static void main(String[] args) {
>               Handler handler = new AbstractHandler() {
>                       public void handle(String arg0, HttpServletRequest arg1,
>                                       HttpServletResponse arg2, int arg3) 
> throws IOException,
>                                       ServletException 
>                       {
>                               System.out.println("Starting processing");
>                               try
>                               {
>                                        // Create a factory for disk-based 
> file items
>                           DiskFileItemFactory factory = new 
> DiskFileItemFactory();
>                           
>                           // Create a new file upload handler
>                           ServletFileUpload upload = new 
> ServletFileUpload(factory);
>       
>                           // Parse the request
>                           List items = upload.parseRequest(arg1);
>                           for (int i = 0; i < items.size(); i++)
>                           {
>                               FileItem file_item = (FileItem) items.get(i);
>                               
>                               System.out.println("Field Name: " + 
> file_item.getFieldName());
>                           }
>                               }
>                               catch (Exception e)
>                               {
>                                       e.printStackTrace();
>                                       System.out.println("Exception occured 
> in processing");
>                               }
>                               finally
>                               {
>                                       System.out.println("Processing 
> completed");
>                               }
>                       }
>               };
>               try
>               {
>                       Server server = new Server(8080);
>                       server.setHandler(handler);
>                       server.start();
>               }
>               catch (Exception e)
>               {
>                       
>               }
>       }
> }
> === HTML Document ===
> <html>
>     <head>
>     </head>
>     <body>
>         <form name="test" action="http://localhost:8080/"; method="post" 
> enctype="multipart/form-data">
>             <input type="file" name="fileupload"/>
>             <input type="submit"/>
>         </form>
>     </body>
> </html>

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to