Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Processing of multipart/form-data request failed. Read timed out

Tags:

Other questions on Stack Overflow have addressed this question, but none of the answers provided have helped me to address the issue.

I'm trying to upload a file of anywhere between 10 kB to 16 MB from an applet using Apache HTTP Commons. Everything works fine in my local environment.

I'm receiving the following exception only on my production server (Tomcat 6.0, https://www.dailyrazor.com/), regardless of file size:

org.apache.commons.fileupload.FileUploadException: Processing of multipart/form-data request failed. Read timed out     at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:384)     at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:116)     at com.actura.helper.UploadHelper.processUpload(UploadHelper.java:92)     at com.actura.voice.upload.FileUploadServlet.process(FileUploadServlet.java:85)     at com.actura.voice.upload.FileUploadServlet.doPost(FileUploadServlet.java:75)     at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)     at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)     at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)     at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)     at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)     at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)     at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)     at java.lang.Thread.run(Thread.java:662) 

This is the debugging log of Commons IO:

2012-Sep-18 11:26:28,446 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory constructor (listener)  2012-Sep-18 11:26:28,794 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory createItem  2012-Sep-18 11:26:28,800 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside MonitoredDiskFileItem constructor  2012-Sep-18 11:26:28,800 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside getOutputStream()  2012-Sep-18 11:26:28,802 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream    DEBUG inside MonitoredOutputStream constructor  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream    DEBUG leaving MonitoredOutputStream contructor  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG leaving getOutputStream()  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory createItem  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside MonitoredDiskFileItem constructor  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside getOutputStream()  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream    DEBUG inside MonitoredOutputStream constructor  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream    DEBUG leaving MonitoredOutputStream contructor  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG leaving getOutputStream()  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory createItem  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside MonitoredDiskFileItem constructor  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside getOutputStream()  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream    DEBUG inside MonitoredOutputStream constructor  2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream    DEBUG leaving MonitoredOutputStream contructor  2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG leaving getOutputStream()  2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory createItem  2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside MonitoredDiskFileItem constructor  2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside getOutputStream()  2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream    DEBUG inside MonitoredOutputStream constructor  2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream    DEBUG leaving MonitoredOutputStream contructor  2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG leaving getOutputStream()   processing folder... /home/dixieh83/public_html/ActuraVoiceRecorderDemo/temp 2012-Sep-18 11:27:47,062 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory constructor (listener)  2012-Sep-18 11:27:47,461 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory createItem  2012-Sep-18 11:27:47,461 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside MonitoredDiskFileItem constructor  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside getOutputStream()  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream    DEBUG inside MonitoredOutputStream constructor  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream    DEBUG leaving MonitoredOutputStream contructor  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG leaving getOutputStream()  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory createItem  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside MonitoredDiskFileItem constructor  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside getOutputStream()  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream    DEBUG inside MonitoredOutputStream constructor  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream    DEBUG leaving MonitoredOutputStream contructor  2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG leaving getOutputStream()  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory createItem  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside MonitoredDiskFileItem constructor  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside getOutputStream()  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream    DEBUG inside MonitoredOutputStream constructor  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream    DEBUG leaving MonitoredOutputStream contructor  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG leaving getOutputStream()  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory    DEBUG inside MonitoredDiskFileItemFactory createItem  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside MonitoredDiskFileItem constructor  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG inside getOutputStream()  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream    DEBUG inside MonitoredOutputStream constructor  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream    DEBUG leaving MonitoredOutputStream contructor  2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem    DEBUG leaving getOutputStream()  

Other than this upload issue my applet works fine.

This is the configuration of the server as described in my production server's server.xml file:

<!-- Define an AJP 1.3 Connector on port 8009 --> <Connector address="127.0.0.1" port="9609" enableLookups="false" protocol="AJP/1.3" connectionTimeout="30000" maxThreads="50" minSpareThreads="1" maxSpareThreads="3" disableUploadTimeout="true" />  

The speed of my internet connection is fine (2.01 Mbps down and 0.42 Mbps up), so this exception leaves me puzzled. I've already set connectionTimeOut to 3000000, but I still got the exception. Should I set connectionTimeOut to -1 to make it unlimited?

File permissions are set to 777 on the directory from which I'm uploading and I'm using JDK version 7 to run the applet in the browser.

Java console output:

Java Plug-in 10.7.2.10 Using JRE version 1.7.0_07-b10 Java HotSpot(TM) Client VM 

When the upload fails, I get this in the console:

java.net.SocketException: Connection reset by peer: socket write error     at java.net.SocketOutputStream.socketWrite0(Native Method)     at java.net.SocketOutputStream.socketWrite(Unknown Source)     at java.net.SocketOutputStream.write(Unknown Source)     at org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:169)     at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:119)     at org.apache.http.entity.mime.content.InputStreamBody.writeTo(InputStreamBody.java:70)     at org.apache.http.entity.mime.HttpMultipart.doWriteTo(HttpMultipart.java:206)     at org.apache.http.entity.mime.HttpMultipart.writeTo(HttpMultipart.java:224)     at org.apache.http.entity.mime.MultipartEntity.writeTo(MultipartEntity.java:183)     at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:98)     at org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108)     at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:122)     at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:271)     at org.apache.http.impl.conn.ManagedClientConnectionImpl.sendRequestEntity(ManagedClientConnectionImpl.java:197)     at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:257)     at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)     at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1066)     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1044)     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1035)     at com.actura.app.util.ApplicationUtil.uploadUsingApache(ApplicationUtil.java:143)     at com.actura.app.util.ApplicationUtil.saveWaveToServer(ApplicationUtil.java:90)     at com.actura.app.capture.RecorderUI.saveButtonActionPerformed(RecorderUI.java:1856)     at com.actura.app.capture.RecorderUI.access$17(RecorderUI.java:1824)     at com.actura.app.capture.RecorderUI$7.actionPerformed(RecorderUI.java:1325)     at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)     at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)     at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)     at javax.swing.DefaultButtonModel.setPressed(Unknown Source)     at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)     at java.awt.Component.processMouseEvent(Unknown Source)     at javax.swing.JComponent.processMouseEvent(Unknown Source)     at java.awt.Component.processEvent(Unknown Source)     at java.awt.Container.processEvent(Unknown Source)     at java.awt.Component.dispatchEventImpl(Unknown Source)     at java.awt.Container.dispatchEventImpl(Unknown Source)     at java.awt.Component.dispatchEvent(Unknown Source)     at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)     at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)     at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)     at java.awt.Container.dispatchEventImpl(Unknown Source)     at java.awt.Component.dispatchEvent(Unknown Source)     at java.awt.EventQueue.dispatchEventImpl(Unknown Source)     at java.awt.EventQueue.access$200(Unknown Source)     at java.awt.EventQueue$3.run(Unknown Source)     at java.awt.EventQueue$3.run(Unknown Source)     at java.security.AccessController.doPrivileged(Native Method)     at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)     at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)     at java.awt.EventQueue$4.run(Unknown Source)     at java.awt.EventQueue$4.run(Unknown Source)     at java.security.AccessController.doPrivileged(Native Method)     at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)     at java.awt.EventQueue.dispatchEvent(Unknown Source)     at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)     at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)     at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)     at java.awt.EventDispatchThread.pumpEvents(Unknown Source)     at java.awt.EventDispatchThread.pumpEvents(Unknown Source)     at java.awt.EventDispatchThread.run(Unknown Source) 

i have come to know that this might be a problem of my ISP. I just wonder if it is the problem of iSP why i can smoothly uses software like temviewer and Skype ??

The following is the code that performs the upload:

public static String uploadUsingApache(URL url, List<File> list,             String userId, String accountId, String waveDuration)             throws Exception {          // The execution:         DefaultHttpClient httpclient = new DefaultHttpClient();          HttpPost method = new HttpPost(url.toString());          MultipartEntity entity = new MultipartEntity();         entity.addPart("userId", new StringBody(userId, Charset                 .forName("UTF-8")));         entity.addPart(IVR_ACCOUNT_KEY, new StringBody(accountId, Charset                 .forName("UTF-8")));         entity.addPart(IVR_MP3LEN_KEY, new StringBody(waveDuration, Charset                 .forName("UTF-8")));          // FileBody fileBody = new FileBody(list.get(0));         // entity.addPart("file", fileBody);          for (File f : list) {              byte[] imageBytes = fileToByteArray(f);             entity.addPart("attachment_field", new InputStreamKnownSizeBody(                     new ByteArrayInputStream(imageBytes), imageBytes.length,                     "audio/wav", f.getName()));             method.setEntity(entity);         }          ResponseHandler<String> responseHandler = new BasicResponseHandler();          // HttpResponse response = httpclient.execute(method,responseHandler);         String responseText = httpclient.execute(method, responseHandler);          // error text         if (responseText.contains("<exception>")) {             responseText = responseText.replace("<exception>", "");             responseText = responseText.replace("</exception>", "");             throw new Exception(responseText);         }          // System.out.println(" Status " +response.getStatusLine());         List<String> deleteList = Arrays.asList(responseText.split(","));          StringBuffer sb = new StringBuffer();         int cnt = 1;         for (File f : list) {             if (deleteList.contains(f.getName())) {                 sb.append(f.getName() + (cnt == deleteList.size() ? "" : ", "));                 f.delete();                 cnt++;             }          }          if (deleteList.size() > 1) {             sb.append(" are ");         } else if (deleteList.size() == 1) {             sb.append(" is ");         } else {          }          sb.append(" successfully saved.");          return sb.toString();     } 

When I press the upload button on my applet's GUI, it calls above method and at the same time the GUI freezes. 10 to 50 seconds later, the server throws the FileUploadException. The servlet notifies the applet about the exception, but the applet hangs for four or five minutes before notifying the user of the exception.

Why is there so much delay if there's something wrong on the server side?

like image 454
Mihir Avatar asked Sep 18 '12 11:09

Mihir


2 Answers

This helped me out a lot: http://blog.somepixels.net/en/502-proxy-error-uploading-from-apache-mod_proxy-to-tomcat-7/

Basically in my server.xml I set it as:

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"        connectionUploadTimeout="36000000" disableUploadTimeout="false"        connectionTimeout="60000" redirectPort="8443" /> 
like image 95
Gustavo Matias Avatar answered Nov 10 '22 09:11

Gustavo Matias


It's not clear from the question what config you're running with (or what you've already tried), but the problem is almost by definition that the socket timeout is exceeded during the upload.

The error is thrown because the file was not fully received before the relevant timeout was reached.  This is consistent with things working in test (on a local network) but not when running over the much slower internet (especially when it comes to upload speeds).

Have a look at your server.xml for the relevant <Connector> definition. You'll be interested in the value of either the connectionTimeout or connectionUploadTimeout attributes (the latter if disableUploadTimeout is set to true).

In the absence of evidence of more nefarious problems, I expect you can resolve this issue simply by increasing the connection timeout(s).

like image 31
Andrzej Doyle Avatar answered Nov 10 '22 09:11

Andrzej Doyle