Author: markt Date: Wed Dec 19 22:22:36 2012 New Revision: 1424171 URL: http://svn.apache.org/viewvc?rev=1424171&view=rev Log: onDataAvailable() can't throw an IOE (and the user may swallow it anyway) so ensure that when the connection needs to be closed it really is closed.
Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java?rev=1424171&r1=1424170&r2=1424171&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java Wed Dec 19 22:22:36 2012 @@ -89,6 +89,9 @@ public abstract class AbstractProcessor< // Unexpected state return SocketState.CLOSED; } + if (upgradeServletInputStream.isCloseRequired()) { + return SocketState.CLOSED; + } return SocketState.UPGRADED; } Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java?rev=1424171&r1=1424170&r2=1424171&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java Wed Dec 19 22:22:36 2012 @@ -28,7 +28,7 @@ public abstract class AbstractServletInp protected static final StringManager sm = StringManager.getManager(Constants.Package); - + private boolean closeRequired = false; // Start in blocking-mode private volatile Boolean ready = Boolean.TRUE; private volatile ReadListener listener = null; @@ -111,7 +111,12 @@ public abstract class AbstractServletInp public final int read(byte[] b, int off, int len) throws IOException { preReadChecks(); - return doRead(listener == null, b, off, len); + try { + return doRead(listener == null, b, off, len); + } catch (IOException ioe) { + closeRequired = true; + throw ioe; + } } @@ -130,7 +135,13 @@ public abstract class AbstractServletInp // single byte reads run through this method. ReadListener readListener = this.listener; byte[] b = new byte[1]; - int result = doRead(readListener == null, b, 0, 1); + int result; + try { + result = doRead(readListener == null, b, 0, 1); + } catch (IOException ioe) { + closeRequired = true; + throw ioe; + } if (result == 0) { return -1; } else if (result == -1) { @@ -150,6 +161,11 @@ public abstract class AbstractServletInp } + protected final boolean isCloseRequired() { + return closeRequired; + } + + protected abstract boolean doIsReady() throws IOException; protected abstract int doRead(boolean block, byte[] b, int off, int len) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org