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: [email protected]
For additional commands, e-mail: [email protected]