Author: markt Date: Fri Aug 16 12:04:35 2013 New Revision: 1514668 URL: http://svn.apache.org/r1514668 Log: Back-porting JSR-356 Add the Servlet 3.1 based HTTP upgrade mechanism. The aim at this point is to enable the back-ported JSR-356 code to compile. I'm not worried (right now) about whether the added code works or not as long as it doesn't break any existing Tomcat 7 functionality.
Added: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java - copied, changed from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java - copied, changed from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java - copied, changed from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java - copied, changed from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprServletInputStream.java - copied unchanged from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletInputStream.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java - copied unchanged from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprServletOutputStream.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java - copied, changed from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioServletInputStream.java - copied unchanged from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/BioServletInputStream.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioServletOutputStream.java - copied unchanged from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/BioServletOutputStream.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java - copied, changed from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioServletInputStream.java - copied unchanged from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioServletInputStream.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioServletOutputStream.java - copied unchanged from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioServletOutputStream.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ (with props) tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/HttpUpgradeHandler.java - copied, changed from r1514523, tomcat/trunk/java/javax/servlet/http/HttpUpgradeHandler.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ReadListener.java - copied, changed from r1514523, tomcat/trunk/java/javax/servlet/ReadListener.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WebConnection.java - copied, changed from r1514523, tomcat/trunk/java/javax/servlet/http/WebConnection.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WriteListener.java - copied, changed from r1514523, tomcat/trunk/java/javax/servlet/WriteListener.java Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/Processor.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/LocalStrings.properties tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java?rev=1514668&r1=1514667&r2=1514668&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/connector/Request.java Fri Aug 16 12:04:35 2013 @@ -22,6 +22,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; import java.nio.charset.Charset; import java.security.Principal; import java.text.SimpleDateFormat; @@ -40,6 +41,7 @@ import java.util.TimeZone; import java.util.TreeMap; import java.util.concurrent.atomic.AtomicBoolean; +import javax.naming.NamingException; import javax.security.auth.Subject; import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; @@ -75,6 +77,7 @@ import org.apache.catalina.util.Paramete import org.apache.catalina.util.StringParser; import org.apache.coyote.ActionCode; import org.apache.coyote.http11.upgrade.UpgradeInbound; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.ExceptionUtils; @@ -2819,7 +2822,7 @@ public class Request } - // --------------------------------------------------------- Upgrade Methods + // --------------------------------- Tomcat proprietary HTTP upgrade methods public void doUpgrade(UpgradeInbound inbound) throws IOException { @@ -2833,6 +2836,35 @@ public class Request } + // ---------------------------------- Servlet 3.1 based HTTP upgrade methods + + @SuppressWarnings("unchecked") + public <T extends HttpUpgradeHandler> T upgrade( + Class<T> httpUpgradeHandlerClass) throws ServletException { + + T handler; + try { + handler = (T) context.getInstanceManager().newInstance(httpUpgradeHandlerClass); + } catch (InstantiationException e) { + throw new ServletException(e); + } catch (IllegalAccessException e) { + throw new ServletException(e); + } catch (InvocationTargetException e) { + throw new ServletException(e); + } catch (NamingException e) { + throw new ServletException(e); + } + + coyoteRequest.action(ActionCode.UPGRADE, handler); + + // Output required by RFC2616. Protocol specific headers should have + // already been set. + response.setStatus(HttpServletResponse.SC_SWITCHING_PROTOCOLS); + + return handler; + } + + // ------------------------------------------------------ Protected Methods Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/Processor.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/Processor.java?rev=1514668&r1=1514667&r2=1514668&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/Processor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/Processor.java Fri Aug 16 12:04:35 2013 @@ -21,6 +21,7 @@ import java.io.IOException; import java.util.concurrent.Executor; import org.apache.coyote.http11.upgrade.UpgradeInbound; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLSupport; import org.apache.tomcat.util.net.SocketStatus; @@ -43,6 +44,9 @@ public interface Processor<S> { UpgradeInbound getUpgradeInbound(); SocketState upgradeDispatch() throws IOException; + HttpUpgradeHandler getHttpUpgradeHandler(); + SocketState upgradeDispatch(SocketStatus status) throws IOException; + boolean isComet(); boolean isAsync(); boolean isUpgrade(); Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java?rev=1514668&r1=1514667&r2=1514668&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AbstractAjpProcessor.java Fri Aug 16 12:04:35 2013 @@ -34,6 +34,7 @@ import org.apache.coyote.Request; import org.apache.coyote.RequestInfo; import org.apache.coyote.Response; import org.apache.coyote.http11.upgrade.UpgradeInbound; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.buf.ByteChunk; @@ -541,6 +542,22 @@ public abstract class AbstractAjpProcess } + @Override + public SocketState upgradeDispatch(SocketStatus status) throws IOException { + // Should never reach this code but in case we do... + throw new IOException( + sm.getString("ajpprocessor.httpupgrade.notsupported")); + } + + + @Override + public HttpUpgradeHandler getHttpUpgradeHandler() { + // Should never reach this code but in case we do... + throw new IllegalStateException( + sm.getString("ajpprocessor.httpupgrade.notsupported")); + } + + /** * Recycle the processor, ready for the next request which may be on the * same connection or a different connection. Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1514668&r1=1514667&r2=1514668&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java Fri Aug 16 12:04:35 2013 @@ -37,6 +37,7 @@ import org.apache.coyote.http11.filters. import org.apache.coyote.http11.filters.VoidInputFilter; import org.apache.coyote.http11.filters.VoidOutputFilter; import org.apache.coyote.http11.upgrade.UpgradeInbound; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.buf.Ascii; @@ -258,11 +259,18 @@ public abstract class AbstractHttp11Proc /** * Listener to which data available events are passed once the associated - * connection has completed the HTTP upgrade process. + * connection has completed the proprietary Tomcat HTTP upgrade process. */ protected UpgradeInbound upgradeInbound = null; + /** + * Instance of the new protocol to use after the HTTP connection has been + * upgraded using the Servlet 3.1 based upgrade process. + */ + protected HttpUpgradeHandler httpUpgradeHandler = null; + + public AbstractHttp11Processor(AbstractEndpoint endpoint) { super(endpoint); userDataHelper = new UserDataHelper(getLog()); @@ -848,6 +856,10 @@ public abstract class AbstractHttp11Proc upgradeInbound = (UpgradeInbound) param; // Stop further HTTP output getOutputBuffer().finished = true; + } else if (actionCode == ActionCode.UPGRADE) { + httpUpgradeHandler = (HttpUpgradeHandler) param; + // Stop further HTTP output + getOutputBuffer().finished = true; } else { actionInternal(actionCode, param); } @@ -923,7 +935,8 @@ public abstract class AbstractHttp11Proc } while (!error && keepAlive && !comet && !isAsync() && - upgradeInbound == null && !endpoint.isPaused()) { + upgradeInbound == null && + httpUpgradeHandler == null && !endpoint.isPaused()) { // Parsing the request header try { @@ -1630,13 +1643,6 @@ public abstract class AbstractHttp11Proc @Override - public boolean isUpgrade() { - return upgradeInbound != null; - } - - - - @Override public SocketState upgradeDispatch() throws IOException { // Should never reach this code but in case we do... // TODO @@ -1651,6 +1657,26 @@ public abstract class AbstractHttp11Proc } + @Override + public boolean isUpgrade() { + return httpUpgradeHandler != null; + } + + + @Override + public SocketState upgradeDispatch(SocketStatus status) throws IOException { + // Should never reach this code but in case we do... + throw new IOException( + sm.getString("ajpprocessor.httpupgrade.notsupported")); + } + + + @Override + public HttpUpgradeHandler getHttpUpgradeHandler() { + return httpUpgradeHandler; + } + + /** * Provides a mechanism for those connector implementations (currently only * NIO) that need to reset timeouts from Async timeouts to standard HTTP @@ -1717,6 +1743,7 @@ public abstract class AbstractHttp11Proc asyncStateMachine.recycle(); } upgradeInbound = null; + httpUpgradeHandler = null; remoteAddr = null; remoteHost = null; localAddr = null; Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java (from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java&p1=tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractProcessor.java Fri Aug 16 12:04:35 2013 @@ -19,13 +19,10 @@ package org.apache.coyote.http11.upgrade import java.io.IOException; import java.util.concurrent.Executor; -import javax.servlet.ServletInputStream; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpUpgradeHandler; -import javax.servlet.http.WebConnection; - import org.apache.coyote.Processor; import org.apache.coyote.Request; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; +import org.apache.coyote.http11.upgrade.servlet31.WebConnection; import org.apache.juli.logging.Log; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLSupport; @@ -65,12 +62,12 @@ public abstract class AbstractProcessor< // --------------------------------------------------- WebConnection methods @Override - public ServletInputStream getInputStream() throws IOException { + public AbstractServletInputStream getInputStream() throws IOException { return upgradeServletInputStream; } @Override - public ServletOutputStream getOutputStream() throws IOException { + public AbstractServletOutputStream getOutputStream() throws IOException { return upgradeServletOutputStream; } @@ -125,6 +122,19 @@ public abstract class AbstractProcessor< // Currently a NO-OP as upgrade processors are not recycled. } + + // ------------------ Processor methods for Inbound/Outbound based mechanism + + @Override + public UpgradeInbound getUpgradeInbound() { + return null; + } + + @Override + public SocketState upgradeDispatch() throws IOException { + return null; + } + // ---------------------------- Processor methods that are NO-OP for upgrade Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java (from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java&p1=tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletInputStream.java Fri Aug 16 12:04:35 2013 @@ -18,11 +18,14 @@ package org.apache.coyote.http11.upgrade import java.io.IOException; -import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; +import org.apache.coyote.http11.upgrade.servlet31.ReadListener; import org.apache.tomcat.util.res.StringManager; +/** + * Implements the new Servlet 3.1 methods for {@link ServletInputStream}. + */ public abstract class AbstractServletInputStream extends ServletInputStream { protected static final StringManager sm = @@ -34,7 +37,9 @@ public abstract class AbstractServletInp private volatile ReadListener listener = null; - @Override + /** + * New Servlet 3.1 method. + */ public final boolean isFinished() { if (listener == null) { throw new IllegalStateException( @@ -46,7 +51,9 @@ public abstract class AbstractServletInp } - @Override + /** + * New Servlet 3.1 method. + */ public final boolean isReady() { if (listener == null) { throw new IllegalStateException( @@ -68,7 +75,9 @@ public abstract class AbstractServletInp } - @Override + /** + * New Servlet 3.1 method. + */ public final void setReadListener(ReadListener listener) { if (listener == null) { throw new IllegalArgumentException( Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java (from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java&p1=tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AbstractServletOutputStream.java Fri Aug 16 12:04:35 2013 @@ -19,11 +19,14 @@ package org.apache.coyote.http11.upgrade import java.io.IOException; import javax.servlet.ServletOutputStream; -import javax.servlet.WriteListener; +import org.apache.coyote.http11.upgrade.servlet31.WriteListener; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.res.StringManager; +/** + * Implements the new Servlet 3.1 methods for {@link ServletOutputStream}. + */ public abstract class AbstractServletOutputStream extends ServletOutputStream { protected static final StringManager sm = @@ -38,7 +41,9 @@ public abstract class AbstractServletOut private volatile boolean fireListener = false; private volatile byte[] buffer; - @Override + /** + * New Servlet 3.1 method. + */ public final boolean isReady() { if (listener == null) { throw new IllegalStateException( @@ -54,7 +59,9 @@ public abstract class AbstractServletOut } } - @Override + /** + * New Servlet 3.1 method. + */ public final void setWriteListener(WriteListener listener) { if (listener == null) { throw new IllegalArgumentException( @@ -134,7 +141,7 @@ public abstract class AbstractServletOut ExceptionUtils.handleThrowable(t); listener.onError(t); if (t instanceof IOException) { - throw t; + throw (IOException) t; } else { throw new IOException(t); } Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java (from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java&p1=tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java Fri Aug 16 12:04:35 2013 @@ -16,8 +16,7 @@ */ package org.apache.coyote.http11.upgrade; -import javax.servlet.http.HttpUpgradeHandler; - +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.jni.Socket; Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java (from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java&p1=tomcat/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/BioProcessor.java Fri Aug 16 12:04:35 2013 @@ -19,8 +19,7 @@ package org.apache.coyote.http11.upgrade import java.io.IOException; import java.net.Socket; -import javax.servlet.http.HttpUpgradeHandler; - +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.SocketWrapper; Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/LocalStrings.properties?rev=1514668&r1=1514667&r2=1514668&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/LocalStrings.properties (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/LocalStrings.properties Fri Aug 16 12:04:35 2013 @@ -13,8 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. -apr.read.error=Error [{0}] reading data from the APR/native socket. -apr.write.error=Error [{0}] writing data to the APR/native socket. +abstractProcessor.isCloseFail=Failed to close input stream associated with upgraded connection +abstractProcessor.osCloseFail=Failed to close output stream associated with upgraded connection -nio.eof.error=Unexpected EOF read on the socket +upgrade.sis.isFinished.ise=It is illegal to call isFinished() when the ServletInputStream is not in non-blocking mode (i.e. setReadListener() must be called first) +upgrade.sis.isReady.ise=It is illegal to call isReady() when the ServletInputStream is not in non-blocking mode (i.e. setReadListener() must be called first) +upgrade.sis.readListener.null=It is illegal to pass null to setReadListener() +upgrade.sis.read.ise=It is illegal to call any of the read() methods in non-blocking mode without first checking that there is data available by calling isReady() +upgrade.sos.canWrite.ise=It is illegal to call canWrite() when the ServletOutputStream is not in non-blocking mode (i.e. setWriteListener() must be called first) +upgrade.sos.writeListener.null=It is illegal to pass null to setWriteListener() +upgrade.sis.write.ise=It is illegal to call any of the write() methods in non-blocking mode without first checking that there is space available by calling isReady() + +apr.read.error=Unexpected error [{0}] reading data from the APR/native socket. +apr.write.error=Unexpected error [{0}] writing data to the APR/native socket. +apr.closed=The socket associated with this connection has been closed. +nio.eof.error=Unexpected EOF read on the socket Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java (from r1514523, tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java&p1=tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java Fri Aug 16 12:04:35 2013 @@ -16,8 +16,7 @@ */ package org.apache.coyote.http11.upgrade; -import javax.servlet.http.HttpUpgradeHandler; - +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.net.NioChannel; Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java?rev=1514668&r1=1514667&r2=1514668&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeProcessor.java Fri Aug 16 12:04:35 2013 @@ -21,6 +21,7 @@ import java.util.concurrent.Executor; import org.apache.coyote.Processor; import org.apache.coyote.Request; +import org.apache.coyote.http11.upgrade.servlet31.HttpUpgradeHandler; import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState; import org.apache.tomcat.util.net.SSLSupport; import org.apache.tomcat.util.net.SocketStatus; @@ -84,15 +85,29 @@ public abstract class UpgradeProcessor<S } @Override - public final boolean isUpgrade() { - return true; + public final void recycle(boolean socketClosing) { + // Currently a NO-OP as upgrade processors are not recycled. } + + // Servlet 3.1 based HTTP upgrade mechanism. NO-OPs for the proprietary + // Tomcat upgrade mechanism. @Override - public final void recycle(boolean socketClosing) { - // Currently a NO-OP as upgrade processors are not recycled. + public HttpUpgradeHandler getHttpUpgradeHandler() { + return null; + } + + @Override + public SocketState upgradeDispatch(SocketStatus status) throws IOException { + return null; } + @Override + public boolean isUpgrade() { + return false; + } + + // NO-OP methods for upgrade @Override public final Executor getExecutor() { Propchange: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ ------------------------------------------------------------------------------ bugtraq:append = false Propchange: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ ------------------------------------------------------------------------------ bugtraq:label = Bugzilla ID (optional) Propchange: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ ------------------------------------------------------------------------------ --- bugtraq:message (added) +++ bugtraq:message Fri Aug 16 12:04:35 2013 @@ -0,0 +1 @@ +Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=%BUGID% Propchange: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ ------------------------------------------------------------------------------ bugtraq:url = https://issues.apache.org/bugzilla/show_bug.cgi?id=%BUGID% Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/HttpUpgradeHandler.java (from r1514523, tomcat/trunk/java/javax/servlet/http/HttpUpgradeHandler.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/HttpUpgradeHandler.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/HttpUpgradeHandler.java&p1=tomcat/trunk/java/javax/servlet/http/HttpUpgradeHandler.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/HttpUpgradeHandler.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/HttpUpgradeHandler.java Fri Aug 16 12:04:35 2013 @@ -14,12 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package javax.servlet.http; +package org.apache.coyote.http11.upgrade.servlet31; /** * Interface between the HTTP upgrade process and the new protocol. - * - * @since Servlet 3.1 */ public interface HttpUpgradeHandler { @@ -30,8 +28,6 @@ public interface HttpUpgradeHandler { * the container to the {@link HttpUpgradeHandler}. * * @param connection The connection that has been upgraded - * - * @since Servlet 3.1 */ void init(WebConnection connection); Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ReadListener.java (from r1514523, tomcat/trunk/java/javax/servlet/ReadListener.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ReadListener.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ReadListener.java&p1=tomcat/trunk/java/javax/servlet/ReadListener.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/ReadListener.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/ReadListener.java Fri Aug 16 12:04:35 2013 @@ -14,23 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package javax.servlet; +package org.apache.coyote.http11.upgrade.servlet31; import java.io.IOException; /** * Receives notification of read events when using non-blocking IO. - * - * @since Servlet 3.1 */ public interface ReadListener extends java.util.EventListener{ /** * Invoked when data is available to read. The container will invoke this * method the first time for a request as soon as there is data to read. - * Subsequent invocations will only occur if a call to - * {@link ServletInputStream#isReady()} has returned false and data has - * subsequently become available to read. + * Subsequent invocations will only occur if a call to {@link + * org.apache.coyote.http11.upgrade.AbstractServletInputStream#isReady()} + * has returned false and data has subsequently become available to read. * * @throws IOException */ Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WebConnection.java (from r1514523, tomcat/trunk/java/javax/servlet/http/WebConnection.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WebConnection.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WebConnection.java&p1=tomcat/trunk/java/javax/servlet/http/WebConnection.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/http/WebConnection.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WebConnection.java Fri Aug 16 12:04:35 2013 @@ -14,34 +14,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package javax.servlet.http; +package org.apache.coyote.http11.upgrade.servlet31; import java.io.IOException; -import javax.servlet.ServletInputStream; -import javax.servlet.ServletOutputStream; +import org.apache.coyote.http11.upgrade.AbstractServletInputStream; +import org.apache.coyote.http11.upgrade.AbstractServletOutputStream; /** * The interface used by a {@link HttpUpgradeHandler} to interact with an upgraded * HTTP connection. - * - * @since Servlet 3.1 */ -public interface WebConnection extends AutoCloseable { +public interface WebConnection { /** - * Provides access to the {@link ServletInputStream} for reading data from - * the client. - * - * @since Servlet 3.1 + * Provides access to the {@link AbstractServletInputStream} for reading + * data from the client. */ - ServletInputStream getInputStream() throws IOException; + AbstractServletInputStream getInputStream() throws IOException; /** - * Provides access to the {@link ServletOutputStream} for writing data to - * the client. - * - * @since Servlet 3.1 + * Provides access to the {@link AbstractServletOutputStream} for writing + * data to the client. */ - ServletOutputStream getOutputStream() throws IOException; + AbstractServletOutputStream getOutputStream() throws IOException; + + /** + * The Servlet 3.1 interface extends AutoCloseable but that is not available + * in Java 6 so this is the single method from that interface. + */ + void close() throws Exception; } \ No newline at end of file Copied: tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WriteListener.java (from r1514523, tomcat/trunk/java/javax/servlet/WriteListener.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WriteListener.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WriteListener.java&p1=tomcat/trunk/java/javax/servlet/WriteListener.java&r1=1514523&r2=1514668&rev=1514668&view=diff ============================================================================== --- tomcat/trunk/java/javax/servlet/WriteListener.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/servlet31/WriteListener.java Fri Aug 16 12:04:35 2013 @@ -14,23 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package javax.servlet; +package org.apache.coyote.http11.upgrade.servlet31; import java.io.IOException; /** * Receives notification of write events when using non-blocking IO. - * - * @since Servlet 3.1 */ public interface WriteListener extends java.util.EventListener{ /** * Invoked when it it possible to write data without blocking. The container * will invoke this method the first time for a request as soon as data can - * be written. Subsequent invocations will only occur if a call to - * {@link ServletOutputStream#isReady()} has returned false and it has since - * become possible to write data. + * be written. Subsequent invocations will only occur if a call to {@link + * org.apache.coyote.http11.upgrade.AbstractServletOutputStream#isReady()} + * has returned false and it has since become possible to write data. * * @throws IOException */ --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org