  | Mailing List | | Home | | Forum Home | | JBoss - Java Application Server | | Tomcat - JSP/Servlet container | | Struts - A MVC web framework | | iText - An open source PDF Java Library | | JDOM - JDOM XML Parser | | JSP - A mailing list about Java Server Pages specification and reference | | J2EE - A mailing list for Java(tm) 2 Platform, Enterprise Edition | | J2EE Pattern - An interest list for Sun Java Center J2EE Pattern Catalog | | Servlet - A mailing list for discussion about Sun Microsystem's Java Servlet API Technology | |
Struts & Hibernate
|
|
|
  | | | Subject: ClientAbortException writing file to servlet 's output stream over SSL in IE | Subject: ClientAbortException writing file to servlet 's output stream over SSL in IE 2007-11-02 - By Jake C
Back
This is in JBOSS 4.0.5-GA. I would guess that it is using Tomcat 5.5 from the log line "[TomcatDeployer] deploy, ctxPath=/, warUrl=.../deploy/jbossweb -tomcat55.sar/ROOT.war/"
This downloads a binary file. I know that the client is not closing the browser.
It works just fine over HTTP.
It works just fine in HTTPS in FireFox.
It throws the following exception in IE:
11:41:42,202 INFO [Util] 0: Writing 16,384 bytes of 57,567 to buffer 11:41:42,202 INFO [Util] 0: Writing 16,384 bytes of 57,567 to buffer 11:41:42,202 INFO [Util] 0: Writing 16,384 bytes of 57,567 to buffer 11:41:42,202 ERROR [Util] Error serving file: <path to file> ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error at org.apache.catalina.connector.OutputBuffer.realWriteBytes (OutputBuffer.java:366) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433) at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:348) at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer .java:392) at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java :381) at org.apache.catalina.connector.CoyoteOutputStream.write (CoyoteOutputStream.java:88) at com.mycompany.myproject.Util.download(Util.java:93) at com.mycompany.myproject.DocumentResource.getResource (DocumentResource.java:122) at org.jboss.seam.servlet.ResourceServlet.doGet(ResourceServlet.java:68) at javax.servlet.http.HttpServlet.service(HttpServlet.java:697) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:173) at org.jboss.seam.web.ContextFilter.doFilter(ContextFilter.java:56) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:173) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter .java:63) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:57) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter .java:49) at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter .java:60) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter .java:49) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter .java:49) at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:79) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter .java:49) at org.jboss.seam.web.SeamFilter.doFilter(SeamFilter.java:84) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter (ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:178) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke (SecurityAssociationValve.java:175) at org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:432) at org.jboss.web.tomcat.security.JaccContextValve.invoke (JaccContextValve.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve .java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve .java:105) at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke (CachedConnectionValve.java:156) at org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter .java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor .java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler .processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket (PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run (MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:619) Caused by: java.net.SocketException: Software caused connection abort: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:136) at com.sun.net.ssl.internal.ssl.OutputRecord.writeBuffer(OutputRecord .java:283) at com.sun.net.ssl.internal.ssl.OutputRecord.write(OutputRecord.java :272) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl .java:665) at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream .java:59) at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes (InternalOutputBuffer.java:746) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:433) at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:348) at org.apache.coyote.http11.InternalOutputBuffer $OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:769) at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite (ChunkedOutputFilter.java:125) at org.apache.coyote.http11.InternalOutputBuffer.doWrite (InternalOutputBuffer.java:579) at org.apache.coyote.Response.doWrite(Response.java:559) at org.apache.catalina.connector.OutputBuffer.realWriteBytes (OutputBuffer.java:361) ... 46 more
Here is my servlet code:
public static void download(HttpServletResponse response, File file, String downloadName) throws IOException { FileInputStream fis = null; OutputStream os = null; if(file != null && file.exists()) { try { byte[] buf = new byte[BUF_SIZE]; if(downloadName != null && downloadName.trim().length() > 0) response.setHeader("Content-Disposition", "attachment ;filename=\"" + downloadName + "\""); response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("application/octet-stream"); response.setContentLength((int)file.length());
fis = new FileInputStream(file); os = response.getOutputStream(); int len = -1; int x = 0; while((len = fis.read(buf)) != -1) { log.info("{0}: Writing {1} bytes of {2} to buffer", x, len, file.length()); os.write(buf, 0, len); } } catch (Throwable t) { log.error("Error serving file: "+file, t); response.sendError(HttpServletResponse.SC_NOT_FOUND); } finally { if(fis != null) try{fis.close();}catch(Throwable t){ log.warn("Error closing input stream: " + t.getMessage(), t ); } if( os != null) try{ os.flush();}catch(Throwable t){ if("org.apache.catalina.connector.ClientAbortException" .equals(t.getClass().getCanonicalName())) log.info("client canceled download"); else log.warn("Error flushing output stream: " + t.getClass( ).getCanonicalName(), t); } if( os != null) try{ os.close();}catch(Throwable t){ log.warn("Error closing output stream: " + t.getMessage(), t); } } } else { log.error("Error serving unknown file: "+file); response.sendError(HttpServletResponse.SC_NOT_FOUND); } }
To get SSL running, I uncommented the SSL Connector tag in server.xml and changed the port to 443. I also changed the port to 80 and the rediredtPort to 443 in the HTTP Conector tag. I am using a self-signed certificate generated with JDK 1.5 keytool app.
It works even in IE if the file is small.
Any ideas what I'm doing wrong?
Am I asking in the correct place? :-)
__ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ __ Windows Live Hotmail and Microsoft Office Outlook ? together at last. ?Get it now. http://office.microsoft.com/en-us/outlook/HA102225181033.aspx?pid=CL100626971033
|
|
 |