Author: markt Date: Tue Jul 2 13:27:46 2013 New Revision: 1498929 URL: http://svn.apache.org/r1498929 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55171 If the client closed the connection, the write of any remainign data in the buffer in AbstractServletOutputStream would fail but the remote endpoint was not notified. This meant that blocking writes would block for ever eventually locking up the entire server.
Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java?rev=1498929&r1=1498928&r2=1498929&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java Tue Jul 2 13:27:46 2013 @@ -21,6 +21,7 @@ import java.io.IOException; import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; +import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.res.StringManager; public abstract class AbstractServletOutputStream extends ServletOutputStream { @@ -127,7 +128,17 @@ public abstract class AbstractServletOut protected final void onWritePossible() throws IOException { synchronized (writeLock) { - writeInternal(buffer, 0, buffer.length); + try { + writeInternal(buffer, 0, buffer.length); + } catch (Throwable t) { + ExceptionUtils.handleThrowable(t); + listener.onError(t); + if (t instanceof IOException) { + throw t; + } else { + throw new IOException(t); + } + } // Make sure isReady() and onWritePossible() have a consistent view of // buffer and fireListener when determining if the listener should fire Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java?rev=1498929&r1=1498928&r2=1498929&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java Tue Jul 2 13:27:46 2013 @@ -492,7 +492,7 @@ public abstract class WsRemoteEndpointIm } - protected final void close() { + public final void close() { for (EncoderEntry entry : encoderEntries) { entry.getEncoder().destroy(); } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java?rev=1498929&r1=1498928&r2=1498929&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsHttpUpgradeHandler.java Tue Jul 2 13:27:46 2013 @@ -237,6 +237,7 @@ public class WsHttpUpgradeHandler implem @Override public void onError(Throwable throwable) { wsProtocolHandler.onError(throwable); + wsRemoteEndpointServer.close(); } } } Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java?rev=1498929&r1=1498928&r2=1498929&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointImplServer.java Tue Jul 2 13:27:46 2013 @@ -16,6 +16,7 @@ */ package org.apache.tomcat.websocket.server; +import java.io.EOFException; import java.io.IOException; import java.net.SocketTimeoutException; import java.nio.ByteBuffer; @@ -121,6 +122,9 @@ public class WsRemoteEndpointImplServer @Override protected void doClose() { + if (handler != null) { + clearHandler(new EOFException()); + } try { sos.close(); } catch (IOException e) { @@ -138,8 +142,8 @@ public class WsRemoteEndpointImplServer protected void onTimeout() { - close(); clearHandler(new SocketTimeoutException()); + close(); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org