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


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